meda
meda

Reputation: 45490

How to use textfieldParser to edit a CSV file?

I wrote a small function that reads a csv file using textField line by line , edit it a specific field then write it back to a CSV file.

Here is the code :

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 ! ");
        }
    }

The field I want to edit is the 12th one (parts[12]):

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

the file is created the problem is it does not edit the file and half the records are missing. I am hoping someone could point the mistake.

Upvotes: 4

Views: 5418

Answers (1)

Servy
Servy

Reputation: 203834

You call both parser.ReadFields() and parser.ReadLine(). Each of them advance the cursor by one. That's why you're missing half the rows. Change the while to:

while(!parser.EndOfData)

Then add parts = parser.ReadFields(); to the end of the loop. Not having this is why you're edit isn't being seen.

You can also remove:

if (parts == null)
{
    break;
} 

Since you no longer have line, you'll need to use the fields to keep track of your results:

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

Upvotes: 7

Related Questions