1

ParseCSV関数を使用してC#でCSVファイルを解析しています。

CSVファイルの行の最後の列には次のものが含まれます:NM 120922C00002500(この後のスペースがたくさんあります)

ParseCSV関数で、CSVファイルを読み取った結果として入力文字列を渡します。

inputstringの一部は次のとおりです。

"1"、000066、 "07/30/2012"、 "53193315D4"、 "B"、 "99AAXXPB0"、 ""、 ""、 ""、 "CALL NM 09/22/12 00002.500"、 "MG"、 100.00,1.050000,310,32550.00,25530.70,360,37800.00,30477.78、 "C"、2.50000,09 / 22/2012、 "NM"、" NM120922C00002500 "。

CSVParse関数で、次のことを行っています。

string csvParsingRegularExpressionOld = Prana.Global.ConfigurationHelper.Instance.GetAppSettingValueByKey("CSVParsingRegularExpression");
string csvParsingRegularExpression = csvParsingRegularExpressionOld.Replace("\\\\", "\\");

csvParsingRegularExpressionでは、値は次のようになります。

((?<field>[^",\r\n]*)|"(?<field>([^"]|"")*)")(,|(?<rowbreak>\r\n|\n|$))

私はフォローアップします

Regex re = new Regex(csvParsingRegularExpression);

MatchCollection mc = re.Matches(inputString);

foreach (Match m in mc) 
{

   field = m.Result("${field}").Replace("\"\"", "\"");
}

ただし、最後の値「NM 120922C00002500」に関しては、ここのフィールドには空の文字列が含まれています。この問題の可能な解決策は何でしょうか?

CSVファイルに問題があるのか​​、正規表現メソッド「Matches」に問題があるのか​​わかりません。

4

3 に答える 3

1

CSV の読み取りに正規表現を使用しないでください。

http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

于 2012-08-06T05:39:27.910 に答える
0

絶対に正規表現を使用したくない場合は、ここに私が作成した小さなクラスがあり、その後にその使用法が続きます:

public class ParseHelper
{
    public char TextDelimiter { get; set; }
    public char TextQualifier { get; set; }
    public char EscapeCharacter { get; set; }

    public List<string> Parse(string str, bool keepTextQualifiers = false)
    {
        List<string> returnedValues = new List<string>();

        bool inQualifiers = false;
        string currentWord = "";

        for (int i = 0; i < str.Length; i++)
        {
            //Looking for EscapeCharacter.
            if (str[i] == EscapeCharacter)
            {
                i++;
                currentWord += str[i];
                continue;
            }

            //Looking for TextQualifier.
            if (str[i] == TextQualifier)
            {
                if (keepTextQualifiers)
                    currentWord += TextQualifier;

                inQualifiers = !inQualifiers;
                continue;
            }

            //Looking for TextDelimiter.
            if (str[i] == TextDelimiter && !inQualifiers)
            {
                returnedValues.Add(currentWord);
                currentWord = "";
                continue;
            }

            currentWord += str[i];
        }

        if (inQualifiers)
            throw new FormatException("The input string, 'str', is not properly formated.");

        returnedValues.Add(currentWord);
        currentWord = "";

        return returnedValues;
    }
}

使用法、あなたのケースに基づいて:

ParseHelper ph = new ParseHelper() {
    TextDelimiter = ',',
    TextQualifier = '"',
    EscapeCharacter = '\'};
List<string> parsedLine = ph.Parse(unparsedLine);
于 2012-08-06T05:50:05.283 に答える
0

最後のグループは引用符の外側のピリオドで終わっているため、一致していません。正規表現の終了グループにピリオドを追加すると、次のように機能します。

(\"?(?<field>[^",\r|\n]*)\"?\,?)*\.?(?<rowbreak>[\r|\n]*)

他のコメントが指摘しているように、データが本当に有効なCSVである場合は、独自のパーサーをロールすることはお勧めできません(指定されたサンプルが仕様に一致するかどうかを確認する必要はありませんでした)。利用可能なパーサーはたくさんあり、いくつかのエッジケースを見逃す可能性があります。

于 2012-08-01T15:40:35.213 に答える