0

私はデータが正しいはずであることを知っています。私はデータを制御できず、上司は、他の誰かの間違いに対処する方法を見つける必要があると私に言うつもりです. ですから、データが悪いのは私の問題ではないと言わないでください。

とにかく、これは私が見ているものです:

"Words","email@email.com","","4253","57574","FirstName","","LastName, MD","","","576JFJD","","1971","","Words","Address","SUITE "A"","City","State","Zip","Phone","",""

機密保持のため、データはスクラブされています。

ご覧のとおり、データには引用符が含まれており、これらの引用されたフィールドの一部にはコンマが含まれています。したがって、それらを削除することはできません。しかし、「スイート A」はパーサーから外れています。引用符が多すぎます。>.<

Microsoft.VisualBasic.FileIO 名前空間の TextFieldParser を次の設定で使用しています。

            parser.HasFieldsEnclosedInQuotes = true;
            parser.SetDelimiters(",");
            parser.TextFieldType = FieldType.Delimited;

エラーは

MalformedLineException: 行 9871 は、現在の区切り記号を使用して解析できません。

これを説明するために何らかの方法でデータをスクラブしたいのですが、その方法がわかりません。それとも、この行をスキップする方法がありますか? 上層部は、必要なデータをスキップするだけでは承認しないと思いますが。

4

6 に答える 6

3

csvの迷子マークを取り除こうとしているだけの場合は"、次の正規表現を使用してそれらを見つけて置き換えることができます。'

String sourcestring = "source string to match with pattern";
String matchpattern = @"(?<!^|,)""(?!(,|$))";
String replacementpattern = @"$1'";
Console.WriteLine(Regex.Replace(sourcestring,matchpattern,replacementpattern,RegexOptions.Multiline));

説明:

@"(?<!^|,)""(?!(,|$))";"文字列の先頭または a が前に,なく、文字列の末尾または a が後にないものをすべて検索します。,

于 2016-08-29T20:43:30.507 に答える
2

に詳しくありませんTextFieldParser。ただし、CsvHelperでは、無効なデータのカスタム ハンドラを追加できます。

var config = new CsvConfiguration();
config.IgnoreReadingExceptions = true;
config.ReadingExceptionCallback += (e, row) =>
{
    // you can add some custom patching here if possible
    // or, save the line numbers and add/edit them manually later.
};

using(var file = File.OpenRead(".csv"))
using(var reader = new CsvReader(reader, config))
{
    reader.GetRecords<YourDtoClass>();
}
于 2016-08-29T20:12:17.747 に答える