如何在引号之间忽略逗号而拆分(',')字符串?

Jak*_*ith 10 c# string split

我.Split(',')在字符串上使用该方法,我知道该字符串由逗号分隔,我希望将这些值分开并放入string[]对象中.这适用于这样的字符串:

78,969.82,GW440,.

但是当第二个值超过1000时,值开始看起来不同,就像在这个例子中找到的那样:

79,"1,013.42",GW450,....

这些值来自电子表格控件,我在其中使用内置控件的ExportToCsv(...)方法,并解释了为什么实际数值的格式化版本.

题

有没有办法可以让.Split(',')方法忽略引号内的逗号?我实际上并不希望将值"1,013.42"拆分为"1和013.42".

有任何想法吗?谢谢!

更新

我真的很想在不使用第三方工具的情况下这样做,因为我的用例实际上并没有涉及除此之外的许多其他情况,即使它是我工作解决方案的一部分,使用这样的工具并没有真正受益此刻的任何人.我希望有一些东西可以快速解决我丢失的这个特殊用例,但现在是周末,我会看到周一我能不能再给这个问题多一次更新了解决方案我最终来了起来.到目前为止,谢谢大家的帮助,我将在星期一进一步评估每个答案.

Eva*_*n L 11

这是一个相当直接的CSV Reader实现,我们在这里的一些项目中使用它.易于使用并处理您正在谈论的案例.

首先是CSV类

public static class Csv
{
    public static string Escape(string s)
    {
        if (s.Contains(QUOTE))
            s = s.Replace(QUOTE, ESCAPED_QUOTE);

        if (s.IndexOfAny(CHARACTERS_THAT_MUST_BE_QUOTED) > -1)
            s = QUOTE + s + QUOTE;

        return s;
    }

    public static string Unescape(string s)
    {
        if (s.StartsWith(QUOTE) && s.EndsWith(QUOTE))
        {
            s = s.Substring(1, s.Length - 2);

            if (s.Contains(ESCAPED_QUOTE))
                s = s.Replace(ESCAPED_QUOTE, QUOTE);
        }

        return s;
    }


    private const string QUOTE = "\"";
    private const string ESCAPED_QUOTE = "\"\"";
    private static char[] CHARACTERS_THAT_MUST_BE_QUOTED = { ',', '"', '\n' };

}
Run Code Online (Sandbox Code Playgroud)

然后一个非常好的Reader实现 - 如果你需要它.只需上面的CSV类,您就可以完成所需的操作.

public sealed class CsvReader : System.IDisposable
{
    public CsvReader(string fileName)
        : this(new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
    }

    public CsvReader(Stream stream)
    {
        __reader = new StreamReader(stream);
    }

    public System.Collections.IEnumerable RowEnumerator
    {
        get
        {
            if (null == __reader)
                throw new System.ApplicationException("I can't start reading without CSV input.");

            __rowno = 0;
            string sLine;
            string sNextLine;

            while (null != (sLine = __reader.ReadLine()))
            {
                while (rexRunOnLine.IsMatch(sLine) && null != (sNextLine = __reader.ReadLine()))
                    sLine += "\n" + sNextLine;

                __rowno++;
                string[] values = rexCsvSplitter.Split(sLine);

                for (int i = 0; i < values.Length; i++)
                    values[i] = Csv.Unescape(values[i]);

                yield return values;
            }

            __reader.Close();
        }

    }

    public long RowIndex { get { return __rowno; } }

    public void Dispose()
    {
        if (null != __reader) __reader.Dispose();
    }

    //============================================


    private long __rowno = 0;
    private TextReader __reader;
    private static Regex rexCsvSplitter = new Regex(@",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))");
    private static Regex rexRunOnLine = new Regex(@"^[^""]*(?:""[^""]*""[^""]*)*""[^""]*$");

}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它.

var reader = new CsvReader(new FileStream(file, FileMode.Open));
Run Code Online (Sandbox Code Playgroud)

注意:这将打开现有的CSV文件,但可以相当容易地修改以获得string[]您需要的文件.