如何使用LINQ读取csv,某些列包含,

时间:2015-04-29 14:40:47

标签: linq

我有以下方式的CSV。 “India,Inc”是一个公司名称,其中包含单个值

如何在LINQ中获取值

12321,32432,423423,Kevin O'Brien,“India,Inc”,234235,23523452,235235

4 个答案:

答案 0 :(得分:0)

因为你只读取了被逗号分隔的值,如果你只是把它们视为任何其他角色,那么这些空格不应该引起问题。

var values = File.ReadLines(path)
    SelectMany(line => line.Split(','));

答案 1 :(得分:0)

正则表达式会起作用,由于递归性质而有点讨厌,但它确实达到了你的目标。

        List<string> matches = new List<string>();

        string subjectString = "12321,32432,423423,Kevin O'Brien,\"India,Inc\",234235,23523452,235235";

        Regex regexObj = new Regex(@"(?<="")\b[123456789a-z,']+\b(?="")|[123456789a-z']+", RegexOptions.IgnoreCase);
        Match matchResults = regexObj.Match(subjectString);
        while (matchResults.Success)
        {
            matches.Add(matchResults.Value);
            // matched text: matchResults.Value
            // match start: matchResults.Index
            // match length: matchResults.Length
            matchResults = matchResults.NextMatch();
        }

答案 2 :(得分:0)

在大多数情况下这应该足够了。它处理带引号的字符串,带有双引号的字符串和嵌入的逗号。

var subjectString = "12321,32432,423423,Kevin O'Brien,\"India,Inc\",234235,\"Test End\"\"\",\"\"\"Test Start\",\"Test\"\"Middle\",23523452,235235";
var result=Regex.Split(subjectString,@",(?=(?:[^""]*""[^""]*"")*[^""]*$)")
  .Select(x=>x.StartsWith("\"") && x.EndsWith("\"")?x.Substring(1,x.Length-2):x)
  .Select(x=>x.Replace("\"\"","\""));

但是,如果你的字段中有一个双引号,并且字符串本身没有用双引号括起来,它确实会中断 - 这在CSV文件的大多数定义中都是无效的,其中包含CR的任何字段,LF,逗号或双引号必须用双引号括起来。

您应该能够重复使用相同的Regex表达式来打破行以及小型CSV文件。更大的你想要更好的实现。用LF替换双引号,并删除匹配的(不带引号的LF)。然后使用正则表达式再次用CR替换引号,并在匹配时拆分。

答案 3 :(得分:0)

我建议使用LINQ to CSV,因为它足以处理特殊字符,包括逗号,引号和小数。他们确实为你解决了很多这些问题。

设置只需要几分钟,这真的值得花时间,因为您不会像使用自定义代码那样遇到这些类型的问题。以下是基本步骤,但请务必遵循上面链接中的说明。

  1. 安装Nuget包
  2. 创建一个表示行项目的类(将字段命名为csv中的名称)
  3. 使用CsvContext.Read()读入可以使用LINQ轻松操作的IEnumerable
  4. 使用CsvContext.Write()将List或IEnumerable写入CSV
  5. 这很容易设置,代码非常少,并且比自己动手更具可扩展性。