【问题标题】:Splitting the line in a CSV using C#使用 C# 在 CSV 中拆分行
【发布时间】:2017-07-13 13:58:51
【问题描述】:

我正在读取一个 CSV 文件,其中一行是这样的

Context Tenant: {Vendor: 1, Customer: 719046046}","1,664,705.67","","7/11/2017 4:55 PM"

现在我想拆分它并将每个值收集到一个数组中。

value[0] should be Context Tenant: {Vendor: 1, Customer: 719046046}
value[1] should be 1,664,705.67
value[2] should be 7/11/2017 4:55 PM.

尝试使用正则表达式和拆分

var values = line1.Split(new char[] { '\\', '"' ,','}, StringSplitOptions.RemoveEmptyEntries);

var values = Regex.Split(line1, "\\,");

但是我无法按预期读取值。你能分享一下吗?

【问题讨论】:

  • 好吧,你的 value[0] 里面有一个逗号,你似乎没有考虑到这一点,所以它肯定会把那个字符串分开
  • 为什么不使用一些 csv 解析器?
  • 也许你是对的@Jonesopolis,但我需要解决这个问题......
  • 似乎分隔符是 "," - 不是 '\\', '"' ,','
  • 嗯,你可能应该这样做。 CSV 是一种看似简单的格式,但如果您的数据中嵌入了逗号,那么您真的不能使用正则表达式轻松处理。

标签: c# regex csv split


【解决方案1】:

这应该可以完成工作。此版本将删除空格

string [] n_new = g.Split(new string[] { "\",\""}, StringSplitOptions.RemoveEmptyEntries)

要摆脱起始结束",您可以在拆分前添加一个额外的Trim

string [] ret = g.Trim('"').Split(new string[] { "\",\""}, StringSplitOptions.RemoveEmptyEntries);

【讨论】:

  • 我想我们快到了。但是我忘了提到你还有其他行以“... :(
  • @Mahesh 所以你在第一个元素的开头有一个额外的"
  • @Mahesh 我进行了编辑并在命令中添加了一个修剪,检查一下
【解决方案2】:

因为您的某些元素包含逗号,所以我建议专门在 "," 上进行拆分,因此请在您的拆分语句中使用:"\",\""。所以你应该最终得到:

var values = Regex.Split(line1, "\",\"");

然后要解决您在结果中包含" 的问题,请考虑:

foreach (string value in string[] values)
    value = value.Replace("\"\"", "");

去掉所有不需要的额外双引号(")。有点老套,但它应该可以解决问题。

【讨论】:

  • 如下所述,我也有几行起始字符是 ",因此使用你提到的逻辑 "\ 被捕获在第一个索引中
  • ?虽然不是。 Regex.Split() 的工作方式是将第二个参数作为一个字符串,每当它遇到 exact 匹配时,它就会拆分字符串。例如,如果我的参数是“xxx”,而我的字符串是“CatxDogxxRatxxxBird”,那么结果将是“CatxDogxxRat”和“Bird”。它只在“xxx”上分裂。只有完整的参数会导致拆分,而不是拆分的一部分。除非我没能解释你在说什么。
  • @CapnJack Mahesh 的意思是,如果一行以双引号 " 开头,那么该字符将包含在 Split 返回的第一个元素中。你的解释只是强调这会发生。显然,Mahesh 不希望拆分输出中包含第一个双引号字符。
猜你喜欢
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
相关资源
最近更新 更多