我有一个.csv文件格式如下:
In: "bob","1234 Main St, New York, NY","cool guy"
我希望删除里面没有逗号的双引号:
Out: bob,"1234 Main St, New York, Ny",cool guy
在PowerShell中有没有办法做到这一点?
我检查过了:
- How to remove double quotes on specific column from CSV file using Powershell script
- http://blogs.technet.com/b/heyscriptingguy/archive/2011/11/02/remove-unwanted-quotation-marks-from-csv-files-by-using-powershell.aspx
- https://social.technet.microsoft.com/Forums/windowsserver/en-US/f6b610b6-bfb2-4140-9529-e61ad30b8927/how-to-export-csv-without-doublequote?forum=winserverpowershell
4条答案
按热度按时间gopyfrb31#
修改"How to remove double quotes on specific column from CSV file using Powershell script"的代码:
正则表达式
(?m)"([^,]*?)"(?=,|$)
匹配逗号或行尾之前的任何" + 0 or more non-commas + "
(通过正向预测和多行选项(?m)
实现,该选项强制$
匹配换行符,而不仅仅是字符串的结尾)。参见regex demo
ui7jx7zq2#
在**PowerShell [Core] v7+**中,您现在可以将
-UseQuotes AsNeeded
与ConvertTo-Csv
和Export-Csv
一起使用,这大大简化了方法:上面的结果如下,显示只有嵌入了
,
的字段被双引号括起来:参见
Export-Csv
v7+ docs:-UseQuotes
接受AsNeeded
、Always
和Newer
-QuoteFields
,它接受一个 * 列(属性)名称数组 *,应该(有选择地)对该数组应用引号。pengsaosao3#
更新:在PowerShell [Core] v7+中,可能有一个更简单的解决方案:参见this answer。
现有的答案与示例输入配合良好:
,
的双引号字段,它首先将整个输入文件加载到内存中,这使得可以在单个管道中使用结果替换输入文件。虽然这很方便,而且比逐行处理更快,但需要注意的是,它可能不是大型输入文件的选项。
"
字符将行拆分为字段)是大型输入文件的替代方案,因为它使用管道逐个处理输入行。(As因此,输入文件不能直接用结果更新。)
如果我们***推广 * OP的要求,也处理包含 * 嵌入
"
字符的字段。***,我们需要一种不同的方法:然后,以下字段必须保留其封闭双引号:
,
字符的双引号字段。例如,"1234 Main St, New York, NY"
"
字符的双引号字段,根据RFC 4180,必须将其转义为""
,即 doubled;例如,"Nat ""King"" Cole"
注意事项:
""
:"([^"]*(?:""[^"]*)*)"
这产生:
更新输入文件:
正如在markg的回答中,由于逐行处理,您不能直接在同一管道中使用输出更新输入文件。
要稍后更新iput文件,请使用临时输出文件,然后用它替换输入文件(
...
表示上面的Get-Content
管道,只不过用$csvFile
代替./test.csv
):请注意,
Set-Content
默认使用系统的单字节扩展ASCII字符编码(即使help topicfalsely states ASCII)。使用
-Encoding
参数允许您指定不同的编码,但请注意,UTF-16 LE(Out-File
/>
的默认值)会导致CSV文件无法被Excel正确识别。x7rlezfr4#
我不知道你剧本的其他部分是什么样子。尝试一些沿着这些线虽然