假设我有这个CSV文件:
NAME,ADDRESS,DATE
"Eko S. Wibowo", "Tamanan, Banguntapan, Bantul, DIY", "6/27/1979"
我想将使用双引号括起来的每个标记存储在一个数组中,是否可以安全地执行此操作而不是使用String split()函数?目前我在RichTextBox中加载文件,然后使用其Lines []属性,我为每个Lines []元素执行一个循环并执行此操作:
string[] line = s.Split(',');
是对RichTextBox.Lines []的引用。 而且你可以清楚地看到,令牌内的逗号很容易搞乱split()函数。所以,不是以我想要的三个令牌结束,而是以6个令牌结束
任何帮助将不胜感激!
答案 0 :(得分:20)
您也可以使用正则表达式:
string input = "\"Eko S. Wibowo\", \"Tamanan, Banguntapan, Bantul, DIY\", \"6/27/1979\"";
string pattern = @"""\s*,\s*""";
// input.Substring(1, input.Length - 2) removes the first and last " from the string
string[] tokens = System.Text.RegularExpressions.Regex.Split(
input.Substring(1, input.Length - 2), pattern);
这会给你:
Eko S. Wibowo
Tamanan, Banguntapan, Bantul, DIY
6/27/1979
答案 1 :(得分:7)
用我自己的方法做到了这一点。它只计算"
和'
字符的数量
根据您的需求改进。
public List<string> SplitCsvLine(string s) {
int i;
int a = 0;
int count = 0;
List<string> str = new List<string>();
for (i = 0; i < s.Length; i++) {
switch (s[i]) {
case ',':
if ((count & 1) == 0) {
str.Add(s.Substring(a, i - a));
a = i + 1;
}
break;
case '"':
case '\'': count++; break;
}
}
str.Add(s.Substring(a));
return str;
}
答案 2 :(得分:2)
这不是您问题的准确答案,但为什么不使用已编写的库来操作CSV文件,很好的例子是LinqToCsv。 CSV可以用各种标点符号分隔。此外,还有一些问题,这些问题已经由图书馆创建者解决。比如处理名称行,处理不同的日期格式以及将行映射到C#对象。
答案 3 :(得分:0)
如果您的CSV行紧密包装,最简单的方法是使用前面提到的结束和尾部删除,然后在连接字符串上进行简单的拆分
string[] tokens = input.Substring(1, input.Length - 2).Split("\",\"");
这仅适用于所有字段都是双引号的,即使它们不是(官方)需要的。它会比RegEx更快,但在使用时会有特定的条件。
如果您的数据看起来非常有用 &#34;姓名&#34;,&#34; 1&#34;,&#34; 12/03/2018&#34;,&#34; Add1,Add2,Add3&#34;,&#34;其他内容& #34;
答案 4 :(得分:0)
您可以将","
替换为;
,然后将其分隔为;
var values= s.Replace("\",\"",";").Split(';');
答案 5 :(得分:0)
五岁了,但总有人想拆分CSV。
如果您的数据既简单又可预测(即从来没有像逗号,引号和换行符这样的特殊字符),则可以使用split()或正则表达式来实现。
但是要正确地支持CSV格式的所有细微差别而无须代码补给,您应该真正使用一个已经掌握所有魔术的库。不要重新发明轮子(除非您这样做当然是为了好玩)。
CsvHelper非常简单易用:
https://joshclose.github.io/CsvHelper/2.x/
using (var parser = new CsvParser(textReader)
{
while(true)
{
string[] line = parser.Read();
if (line != null)
{
// do something
}
else
{
break;
}
}
}
更多讨论/相同问题: Dealing with commas in a CSV file