1

我正在使用 ParseCSV 函数来解析 C# 中的 CSV 文件。

CSV 文件的最后一列包含:NM 120922C00002500(后面有很多空格)

在 ParseCSV 函数中,我传递了一个输​​入字符串,作为读取 CSV 文件的结果。

输入字符串的一部分是:

"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"," NM 120922C00002500 ".

在 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 文件或正则表达式方法“匹配”是否有问题。

4

3 回答 3

1

不要使用正则表达式来读取 CSV。

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

于 2012-08-06T05:39:27.910 回答
0

您不匹配最后一组,因为它以引号外的句点结尾。如果将句点添加到正则表达式的终止组,则它可以工作:

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

尽管正如其他评论所指出的那样,如果数据确实是有效的 CSV 文件,那么滚动您自己的解析器并不是一个好主意(我没有费心检查给定的样本是否与规范匹配)。有很多可用的解析器,你可能会错过一些边缘情况。

于 2012-08-01T15:40:35.213 回答
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 回答