Skip to main content
 首页 » 编程设计

c#之使用正则表达式解析退化 CSV 文件中的逗号和引号

2024年02月03日27qq78292959

我需要解析字符串输入,其中列由列分隔,并且数据中包含逗号的任何字段都用引号引起来(逗号分隔,带引号的文本标识符)。对于这个项目,我需要删除引号和引号对之间出现的任何逗号。基本上,我需要删除字段中包含的逗号和引号,同时保留用于分隔字段的逗号。这是我放在一起处理简单场景的一些代码:

// 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 解析器,正如 Michael Madsen 所建议的那样。
但是,如果您知道引号只会按预期出现,您可以执行以下操作:

str2 = Regex.Replace(str2, "\"[^\"]*\"", 
                     match => match.Value.Trim('\"').Replace(",", ""));