我有一个CSV文件,其中的文字列引用了单引号,其他非文本列没有引号。文本列可能在这些单引号文本列中有逗号或单引号。我在网上找到了一个脚本,但它并没有处理这种情况。
有没有办法在PowerShell中处理这个?
示例:
123,678.89,'hello there1', 'xyz1@gmail.com', 'abc,nds'\n
123,678.89,'hello 'there2', 'xyz2@gmail.com', 'akiu-'nds'\n
输出:
123,678.89|hello there1|xyz1@gmail.com|abc,nds \n
123,678.89|hello 'there2|xyz2@gmail.com|akiu-'nds \n
例2:
123,6272,678.89 ,,,'你好,那里' ,,,,' abc1',' tw,es' ,,' xyz1 @ gmail .COM' ,,,,,,' ABC,nds1' \ n
124,8272,928.89 ,,,,'你好'那里' ,,,' abc2',' twes' ,,,' xyz2 @ gmail.com' ,,' biej' ,,,' ABC' nds2' \ n
125,9272,328.89 ,,'你好' ab3',',outyi' ,,,,' xyz3 @ gmail.com' ,,,,,,' ahct',' abc' nds3' \ n
输出:
123 | 6272 | 678.89 |||你好,那里1 |||| abc1 | tw,es || xyz1@gmail.com |||||| abc,nds1 \ n 124 | 8272 | 928.89 ||||你好' there2 ||| abc2 | twes ||| xyz2@gmail.com || biej ||| abc' nds2 \ n 125 | 9272 | 328.89 ||你好' there3 || abc3 |,outyi |||| xyz3@gmail.com |||||| ahct | abc' nds3 \ n
答案 0 :(得分:1)
这样的事情?
Get-Content C:\temp\file.txt |
ForEach-Object {$_ -replace ",'|',\s+'",'|' -replace "'\\n",' \n'} |
Set-Content C:\temp\newfile.txt
注意:代码只有一行,分为3行,以便更好地阅读。
答案 1 :(得分:1)
与Kiran's answer相似。有一些事情需要改变,所以我不认为有一个适合所有解决方案。我们需要将这些变化联系起来。首先是实际分隔符的逗号,然后是行字符序列的特殊结尾。
$path = "c:\temp\file.csv"
$newDelimiter = "|"
(Get-Content $path) -replace "'\s*?,\s?'|,\s?'|'\s?,",$newDelimiter -replace "'\s*?\\n$","\n" | Set-Content $path
我有一个regex101 link,可以更详细地解释。正在进行更大工作的正则表达式是第一个有三个潜在的替代匹配。这实际上忽略了自己关闭的引用。如果有数据带有引号和逗号组合,那么我认为如果没有更多信息则会编程。
'\s*?,\s?'
:用引号括起来的逗号,可选择由变量空格包围。 ,\s?'
:带可选空格的逗号,后跟引号'\s?,
:引用可选空格后跟逗号因此,上述任何组的匹配都将替换为$newDelimiter
。第二个正则表达式只是查找'\n$
,同时考虑引用和行尾的\n
之间的潜在可选空格。这是删除最后一个单引号的方式。