处理带有单引号字符串的CSV文件以及单引号字符串

时间:2015-06-30 00:12:40

标签: string powershell csv

我有一个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

2 个答案:

答案 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之间的潜在可选空格。这是删除最后一个单引号的方式。