我有以下方式的CSV。 “India,Inc”是一个公司名称,其中包含单个值
如何在LINQ中获取值
12321,32432,423423,Kevin O'Brien,“India,Inc”,234235,23523452,235235
答案 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,因为它足以处理特殊字符,包括逗号,引号和小数。他们确实为你解决了很多这些问题。
设置只需要几分钟,这真的值得花时间,因为您不会像使用自定义代码那样遇到这些类型的问题。以下是基本步骤,但请务必遵循上面链接中的说明。
这很容易设置,代码非常少,并且比自己动手更具可扩展性。