【发布时间】:2010-03-27 20:07:31
【问题描述】:
我需要解析字符串输入,其中列由列分隔,并且数据中包含逗号的任何字段都用引号引起来(逗号分隔,带引号的文本标识符)。对于这个项目,我需要删除引号和引号之间出现的任何逗号。基本上,我需要删除字段中包含的逗号和引号,同时保留用于分隔字段的逗号。这是我整理的一些处理简单场景的小代码:
// Sample input 1: This works and covers 99% of the records that I need to parse.
string str1 = "an_email_address@somewhere.com,2010/03/27 12:2:02,,some_first_name,some_last_name,,\"This Address Works, Suite 200\",Some City,TN,09876-5432,9795551212x123,XYZ";
str1 = Regex.Replace(str1, "\"([^\"^,]*),([^\"^,]*)\"", "$1$2");
Console.WriteLine(str1);
// Outputs: an_email_address@somewhere.com,2010/03/27 12:2:02,,some_first_name,some_last_name,,This Address Works Suite 200,Some City,TN,09876-5432,9795551212x123,XYZ
虽然此代码适用于我的大部分记录,但当字段包含多个逗号时它不起作用。我想做的是修改代码,以便删除列中包含的每个逗号实例,无论字段中有多少逗号。我不想硬编码只处理 2 个逗号、3 个逗号或 25 个逗号。代码应该只删除该字段中的所有逗号。以下是我的代码无法正确处理的示例。
// Sample input 2: This doesn't work since there is more than 1 comma between the quotes.
string str2 = "an_email_address@somewhere.com,2010/03/27 12:2:02,,some_first_name,some_last_name,,\"i,l,k,e, c,o,m,m,a,s, i,n ,m,y, f,i,e,l,d\",Some City,TN,09876-5432,9795551212x123,XYZ";
str2 = Regex.Replace(str2, "\"([^\"^,]*),([^\"^,]*)\"", "$1$2");
Console.WriteLine(str2);
// Desired output: an_email_address@somewhere.com,2010/03/27 12:2:02,,some_first_name,some_last_name,,i like commas in my field,Some City,TN,09876-5432,9795551212x123,XYZ
我怎样才能用正则表达式做到这一点?
【问题讨论】:
-
您描述的格式与 CSV 完全匹配。为什么不使用现有的 CSV 解析器?
-
我正在使用 SSIS 导入几千个遗留日志文件。但是,这些文件存在数据质量问题。有些文件有 13 列,有些有 14 列,有些使用引号包含逗号的文本字段,有些不使用引号并产生“额外”列等。我已经描述了更多问题,但我已经能够在我的数据流中使用脚本转换来处理所有这些问题——除了帖子中描述的问题。