如何用PowerShell合并ES-ES开头行与上行生成TSV文件
解决PowerShell处理TMX转TSV的换行合并问题
方案一:直接解析TMX XML生成TSV(推荐,避免中间TXT的麻烦)
TMX是标准XML格式,直接解析可以跳过提取TXT的步骤,从根源避免换行问题。假设你的TMX中源语言标记为EN-US,目标语言为ES-ES,执行以下代码:
# 替换为你的TMX文件路径 $tmxFilePath = "C:\your\path\input.tmx" # 替换为输出TSV路径 $tsvOutputPath = "C:\your\path\output.tsv" # 加载并解析TMX XML $tmxXml = [xml](Get-Content $tmxFilePath -Raw) # 遍历每个翻译单元,提取对应语言的文本并生成TSV行 $tmxXml.tmx.body.tu | ForEach-Object { # 提取源语言文本(根据实际lang属性调整) $sourceText = ($_.tuv | Where-Object { $_.lang -eq "EN-US" }).seg.Trim() # 提取目标语言文本 $targetText = ($_.tuv | Where-Object { $_.lang -eq "ES-ES" }).seg.Trim() # 输出制表符分隔的行 "$sourceText`t$targetText" } | Out-File $tsvOutputPath -Encoding UTF8
方案二:处理已提取的TXT文件(解决换行合并问题)
如果必须先提取到TXT再处理,按以下步骤解决换行合并问题:
假设你的TXT结构是:跳过前3行表头后,源文本和ES-ES开头的目标文本交替出现,执行以下代码:
# 替换为你的TXT文件路径 $txtFilePath = "C:\your\path\extracted.txt" $tsvOutputPath = "C:\your\path\output.tsv" # 读取所有行,跳过前3行表头,过滤空行 $lines = Get-Content $txtFilePath | Select-Object -Skip 3 | Where-Object { $_ -match '\S' } # 两两分组合并源行和目标行 for ($i = 0; $i -lt $lines.Count; $i += 2) { # 防止最后一行无配对的情况 if ($i + 1 -ge $lines.Count) { break } $source = $lines[$i].Trim() # 移除开头的"ES-ES "并修剪空格 $target = $lines[$i + 1] -replace '^ES-ES\s*', '' | Trim() # 输出TSV行 "$source`t$target" } | Out-File $tsvOutputPath -Encoding UTF8
替代方法:用正则一次性处理文本内容
如果TXT中存在不规则换行,可读取整个文本内容用正则匹配配对行:
$txtContent = Get-Content $txtFilePath -Raw # 移除前3行表头,匹配所有源行+ES-ES目标行的组合 $txtContent -replace '^.*\n.*\n.*\n' | Select-String -Pattern '(?s)(.+?)\nES-ES\s*(.+?)(?=\n|$)' -AllMatches | ForEach-Object { $_.Matches } | ForEach-Object { $source = $_.Groups[1].Value.Trim() $target = $_.Groups[2].Value.Trim() "$source`t$target" } | Out-File $tsvOutputPath -Encoding UTF8
为什么之前逐行处理失败?
逐行处理时,每行是独立的对象,无法直接关联前一行的内容。通过读取所有行后按索引分组,或用正则一次性匹配配对行的方式,就能解决换行合并的问题。
内容的提问来源于stack exchange,提问作者Tiago Moreira
相关产品推荐
相关产品推荐

