如何使用textfieldParser编辑CSV文件?

med*_*eda 3 c# csv parsing textfield

我写了一个小函数,它逐行使用textField读取csv文件,将其编辑为特定字段,然后将其写回CSV文件.

这是代码:

private void button2_Click(object sender, EventArgs e)
    {
        String path = @"C:\file.csv";
        String dpath = @"C:\file_processed.csv";
        List<String> lines = new List<String>();

        if (File.Exists(path))
        {
            using (TextFieldParser parser = new TextFieldParser(path))
            {
                String line;

                parser.HasFieldsEnclosedInQuotes = true;
                parser.Delimiters = new string[] { "," };



                while ((line = parser.ReadLine()) != null)
                {
                      string[] parts = parser.ReadFields();

                     if (parts == null)
                     {
                         break;
                     }                   

                          if ((parts[12] != "") && (parts[12] != "0"))
                          {

                              parts[12] = parts[12].Substring(0, 3);
                              //MessageBox.Show(parts[12]);
                          }

                    lines.Add(line);
                }
            }
            using (StreamWriter writer = new StreamWriter(dpath, false))
            {
                foreach (String line in lines)
                    writer.WriteLine(line);
            }
            MessageBox.Show("CSV file successfully processed ! ");
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想编辑的字段是第12个(部分[12]):

for example : if parts[12] = 000,000,234 then change to 000
Run Code Online (Sandbox Code Playgroud)

创建文件的问题是它不编辑文件而一半的记录丢失.我希望有人可以指出错误.

Ser*_*rvy 6

你打电话给parser.ReadFields()parser.ReadLine(). 它们中的一个都将光标前进一个.这就是为什么你错过了一半的行.更改while为:

while(!parser.EndOfData)
Run Code Online (Sandbox Code Playgroud)

然后添加parts = parser.ReadFields();到循环的末尾.没有这就是你没有看到编辑的原因.

你也可以删除:

if (parts == null)
{
    break;
} 
Run Code Online (Sandbox Code Playgroud)

由于您不再拥有line,您需要使用这些字段来跟踪您的结果:

lines.Add(string.Join(",", parts));//handle string escaping fields if needed.
Run Code Online (Sandbox Code Playgroud)