14

TextFieldParserを使用して CSV ファイルをインポートしようとしています。特定の CSV ファイルが、非標準のフォーマットが原因で問題を引き起こしています。問題の CSV には、フィールドが二重引用符で囲まれています。この問題は、特定のフィールド内にエスケープされていない二重引用符の追加セットがある場合に発生します。

これは、問題を強調する単純化されたテスト ケースです。私が扱っている実際の CSV ファイルは、すべてが同じ形式ではなく、多数のフィールドがあり、これらのファイルのいずれにも、これらのおそらくトリッキーな形式の問題が含まれている可能性があります。

TextReader reader = new StringReader("\"Row\",\"Test String\"\n" +
    "\"1\",\"This is a test string.  It is parsed correctly.\"\n" +
    "\"2\",\"This is a test string with a comma,  which is parsed correctly\"\n" +
    "\"3\",\"This is a test string with double \"\"double quotes\"\". It is parsed correctly\"\n" +
    "\"4\",\"This is a test string with 'single quotes'. It is parsed correctly\"\n" +
    "5,This is a test string with fields that aren't enclosed in double quotes.  It is parsed correctly.\n" +
    "\"6\",\"This is a test string with single \"double quotes\".  It can't be parsed.\"");

using (TextFieldParser parser = new TextFieldParser(reader))
{
    parser.Delimiters = new[] { "," };
    while (!parser.EndOfData)
    {
        string[] fields= parser.ReadFields();
        Console.WriteLine("This line was parsed as:\n{0},{1}",
            fields[0], fields[1]);
    }
}

TextFieldParser を使用して、このタイプのフォーマットで CSV を適切に解析する方法はありますか?

4

6 に答える 6

0

作業ソリューション:

using (TextFieldParser csvReader = new TextFieldParser(csv_file_path))
            {
                csvReader.SetDelimiters(new string[] { "," });
                csvReader.HasFieldsEnclosedInQuotes = false;
                string[] colFields = csvReader.ReadFields();

                while (!csvReader.EndOfData)
                {
                    string[] fieldData = csvReader.ReadFields();
                    for (i = 0; i < fieldData.Length; i++)
                    {
                        if (fieldData[i] == "")
                        {
                            fieldData[i] = null;
                        }
                        else
                        {
                            if (fieldData[i][0] == '"' && fieldData[i][fieldData[i].Length - 1] == '"')
                            {
                                fieldData[i] = fieldData[i].Substring(1, fieldData[i].Length - 2);
                            }
                        }
                    }
                    csvData.Rows.Add(fieldData);
                   }
            }
于 2014-07-03T09:09:12.327 に答える
-1

ファイルの読み取りを開始する前に、TextFieldParser オブジェクトでHasFieldsEnclosedInQuotes = trueを設定してください。

于 2013-05-16T13:30:15.823 に答える