文本文件到csv

时间:2018-03-21 16:03:14

标签: powershell csv

我有以下文本文件,我想将其转换为csv文件:

  • 第一行包含第1列
  • 之后有一行填充" ====="
  • 然后是第2列的内容。此列可以有多行
  • 之后有3条空行表示数据记录已完成。

为了更好地理解,这里有一个例子:

Column number 1 text
=========================
Column number 2 text
More column number 2 text
Col nr 2
More..
<empty line>
<empty line>
<empty line>
Column number 1 text
===============
Col nr 2
Col nr 2
Col nr 2
<empty line>
<empty line>
<empty line>

依旧......

我已尝试过很多powershell命令来进行此类转换,但我没有取得任何成功 有人能帮助我吗? 它不一定是PowerShell脚本。

谢谢!

1 个答案:

答案 0 :(得分:1)

这是一个简洁的PSv3 +解决方案,但可能不容易理解:

Get-Content -Raw file.txt |
  Select-String -AllMatches '(.+)\r?\n=+\r?\n([\s\S]*?)(?:\r?\n){3}' | ForEach-Object {
    $_.Matches | ForEach-Object {
      [pscustomobject] @{
        Col1 = $_.Groups[1].Value
        Col2 = $_.Groups[2].Value
      }
    }
  } | Export-Csv -NoTypeInformation out.csv
  • 请注意,输入文件是作为一个整体预先读取的 - 这可能不是大输入文件的选项。

  • Select-String用于通过正则表达式(正则表达式)提取感兴趣的段落。

    • 正则表达式中的捕获组((...))提取第1列和第2列值。
    • .+匹配非空行上的所有字符(.表示:除\n(LF)以外的任何字符,+表示:一个或多个重复);在整个正则表达式的上下文中,这将捕获column-1值。
    • 为了安全,
    • \r?\n匹配CRLF换行符(Windows)和仅LF换行符(Unix)。
    • =+匹配一个或多个相邻的=字符;即,它与输入中的分隔线匹配。
    • [\s\S]是匹配任何字符的技巧,包括\n(LF);默认情况下,.仅匹配 \n以外的字符; nongreedy 重复符号*?表示匹配应该在某些内容与表达式的其余部分匹配时立即停止;在整个正则表达式的上下文中,这将捕获列-2值。
    • (?:...)非捕获组;我们只需要(...)将量词{3}应用于子表达式\r?\n(正好3次重复),但我们对捕获子表达式匹配的内容不感兴趣;在整个正则表达式的上下文中,这匹配每个块末尾的3个空行(不捕获它们)。
  • ForEach-Object调用遍历所有匹配项,并从capture-group值构造一个属性名为Col1Col2的自定义对象,这是隐式输出的。< / p>

  • Export-Csv然后将生成的对象以CSV格式导出到输出文件out.csv;请注意,{PowerSorhell上Export-Csv使用的默认编码为ASCII,因此请根据需要使用-Encoding参数。

根据您的示例输入,out.csv最终包含以下内容:

"Col1","Col2"
"Column number 1 text","Column number 2 text
More column number 2 text
Col nr 2
More.."
"Column number 1 text","Col nr 2
Col nr 2
Col nr 2"

请注意Col2多行值的方式 - 然而,Import-Csv处理此类值(只要它们是双引号)。