我有以下文本文件,我想将其转换为csv文件:
为了更好地理解,这里有一个例子:
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脚本。
谢谢!
答案 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值构造一个属性名为Col1
和Col2
的自定义对象,这是隐式输出的。< / 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
处理此类值(只要它们是双引号)。