0

当社では、CSV ファイルを提案してくれるベンダーから配信フィードを受け取ります。ただし、テキスト フィールド内の引用文字をエスケープできないため、いくつかの行が無視されます。テキスト フィールド パーサーを使用します。

不良行の例:

"CABLES TO GO"、"87029"、"5.0200"、"47"、"757120870296"、"87029"、"WP SGL ALUM 1 1/2" グロメット"

対応するコード スニペットは次のとおりです。

private static IEnumerable<string> ParseHelper(String line, int lineRead, Encoding enc)
{
    MemoryStream mem = new MemoryStream(enc.GetBytes(line));
    TextFieldParser readerTemp = new TextFieldParser(mem, enc) {CommentTokens = new[] {"#"}};
    readerTemp.SetDelimiters(new[] { "," });
    readerTemp.HasFieldsEnclosedInQuotes = true;
    readerTemp.TextFieldType = FieldType.Delimited;
    readerTemp.TrimWhiteSpace = true;
    try
    {
        var items = readerTemp.ReadFields();
        return items;
    }
    catch (MalformedLineException ex)
    {
        throw new MalformedLineException(String.Format(
            "Line {0} is not valid and will be skipped: {1}\r\n{2}",
            lineRead, readerTemp.ErrorLine, ex));
    }
}

また、このベンダーは、ソース ファイルを変更してこれらの引用符をエスケープすることができません。このようなこれらの行の最善の回避策は何ですか?

4

1 に答える 1

1

回避策はありません。

CSV 仕様では、エスケープされていない引用符でフィールド値をカプセル化できます。フィールド値内に引用符がエスケープされていないファイルが渡された場合は、問題があります。

これらは CSV ファイルではありません (仕様に違反しているため、あなたが思っているものではありません)。

とにかく CSV として解析することを主張する場合は、レコード ターミネータまたはフィールド区切り文字が前に付いていない、エスケープされていないすべての引用符をエスケープすることから始めることができます。

このアプローチはこれまでのところしかありません。破損したデータを元に戻すことができない場合があります。

于 2015-02-05T11:04:54.837 に答える