C# 如何使用textfieldParser编辑CSV文件?

C# 如何使用textfieldParser编辑CSV文件?,c#,parsing,csv,textfield,C#,Parsing,Csv,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&l

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

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

您可以同时调用
parser.ReadFields()
parser.ReadLine()
。它们中的每一个都将光标向前移动一步。这就是为什么你少了一半的行。将
while
更改为:

while(!parser.EndOfData)
然后添加
parts=parser.ReadFields()到循环的末尾。没有这就是为什么你的编辑没有被看到

您还可以删除:

if (parts == null)
{
    break;
} 
由于不再有
,因此需要使用字段来跟踪结果:

lines.Add(string.Join(",", parts));//handle string escaping fields if needed.

你调试过了吗?也许你就能很容易地找出这个问题。。让我印象深刻的是,您没有更新最内部循环中的parts[],因此该行永远不会被拆分为多个部分。请尝试添加
writer.Flush()在编写器启动之前disposed@Dan-o不需要。写入程序被释放,关闭流,同时刷新流。完全可能。我知道
Dispose
被称为
Close
,但不知道它也被称为
Flush
<
Close
不会自动调用code>Flush
@Dan-o是的,它是。当你关闭小溪时,它被冲走了。
lines.Add(string.Join(",", parts));//handle string escaping fields if needed.