如何解析CSV文件时保持引号?(How to keep quotes when parsing cs

2019-10-18 13:03发布

我使用Microsoft.VisualBasic.FileIO.TextFieldParser读取一个CSV文件,对其进行编辑,然后解析它。

问题是报价不被保留解析后。

我试着用parser.HasFieldsEnclosedInQuotes = true; 但它似乎并没有保持报价的某些原因。

当一个字段包含例如报价,此问题违反:前

 "some, field" 

 some, field 

作为两个单独的字段

这里是我的方法

public static void CleanStaffFile()
    {
        String path = @"C:\file.csv";
        String dpath = String.Format(@"C:\file_{0}.csv",DateTime.Now.ToString("MMddyyHHmmss"));
        List<String> lines = new List<String>();

        if (File.Exists(path))
        {
            using (TextFieldParser parser = new TextFieldParser(path))
            {
                parser.HasFieldsEnclosedInQuotes = true;
                parser.Delimiters = new string[] { "," };

                while (!parser.EndOfData)
                {
                    string[] parts = parser.ReadFields();

                    if (parts == null)
                    {
                        break;
                    }

                    if ((parts[12] != "") && (parts[12] != "*,116"))
                    {
                        parts[12] = parts[12].Substring(0, 3);
                    }
                    else
                    {
                        parts[12] = "0";
                    }

                    lines.Add(string.Join(",", parts));
                }
            }

            using (StreamWriter writer = new StreamWriter(dpath, false))
            {
                foreach (String line in lines)
                    writer.WriteLine(line);
            }

        }

        MessageBox.Show("CSV file successfully processed :\n");
    }

Answer 1:

所以,你想有你的报价已经在修改后string.Join(",", parts) ? 那么它的,因为只有它包含分隔了之前包裹在引号领域容易。 就在之前再次添加他们String.Join

所以之前(和期望的):

"some, field" 

后(不希望):

some, field 

这应该工作:

string[] fields = parser.ReadFields();
// insert your logic here ....
var newFields = fields 
    .Select(f => f.Contains(",") ? string.Format("\"{0}\"", f) : f);
lines.Add(string.Join(",", newFields));

编辑

我想保持报价即使不包含逗号

然后,那就更简单了:

var newFields = fields.Select(f => string.Format("\"{0}\"", f));


Answer 2:

TextFieldParser.HasFieldsEnclosedInQuotes属性用于如下,从MSDN页面:

如果属性为True,解析器假定字段被括在引号(”“),并可能包含行尾。

如果一个字段是用引号括起来,例如, abc, "field2a,field2b", field3和该属性为True ,则因为是用引号引起来的所有文本将被退回; 这个例子将返回abc|field2a,field2b|field3 。 此属性设置为False将使这个例子中回归abc|"field2a|field2b"|field3

引号将指示字段,那么其可包含用于通常分离字段的字符(或多个)的开始和结束。 如果你的数据本身有报价,你需要设置HasFieldsEnclosedInQuotesfalse

如果你的数据字段可以包含分离器和报价,你需要开始分析,这是一个问题之前逃脱的报价。 Basicly你要超越简单的CSV文件的能力。



文章来源: How to keep quotes when parsing csv file?