3

textField を使用してcsvファイルを1行ずつ読み取り、特定のフィールドを編集してから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 番目のフィールド (parts[12]) です。

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

ファイルが作成されますが、問題はファイルを編集せず、レコードの半分が欠落していることです。誰かが間違いを指摘してくれることを願っています。

4

1 に答える 1

6

parser.ReadFields()との両方を呼び出しますparser.ReadLine()それぞれがカーソルを1つずつ進めます。そのため、行の半分が欠落しています。次のように変更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 に答える