3

我编写了一个小函数,它使用 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 ! ");
        }
    }

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

for example : if parts[12] = 000,000,234 then change to 000

创建文件的问题是它不编辑文件并且一半的记录丢失。我希望有人能指出错误。

4

1 回答 1

6

您同时调用parser.ReadFields()parser.ReadLine()它们中的每一个都将光标前进一格。这就是为什么你错过了一半的行。更改while为:

while(!parser.EndOfData)

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

您还可以删除:

if (parts == null)
{
    break;
} 

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

lines.Add(string.Join(",", parts));//handle string escaping fields if needed.
于 2013-01-30T22:16:59.850 回答