使用逗号分隔列表的最简单方法

时间:2010-10-17 11:34:16

标签: c# regex string csv

我即将建立一个解决方案,每晚都会收到以逗号分隔的列表。这是一个包含大约14000行的列表,我需要浏览列表并选择列表中的一些值。 我收到的文件是为每个“案例”建立的,大约有50个以分号分隔的值。文件的结构如何:

“”;“2010-10-17”;“”;“”;“”;期间 - 最后24小时“;”问题是客户无法找到......“; 等等,还有43个分号。每个“案例”都以“总计515”的值结束;

我需要做的是完成所有这些“案例”并撤回“案例”中的一些值。 “案例”总是以相同的顺序构建,我知道它总是需要提取的第3,15和45分号值。

我怎样才能以最简单的方式做到这一点?

5 个答案:

答案 0 :(得分:2)

我认为你应该将这个问题分解成更小的问题。以下是我要采取的步骤:

  1. 每个分号分隔的记录代表一个对象。 C#是一种面向对象的语言。不再考虑.csv记录并开始考虑对象。将输入分解为分号分隔记录。
  2. 给定一个以逗号分隔的记录,这些值表示对象的属性。给他们有意义的名字。
  3. 将逗号分隔的记录解析为对象。完成后,您将拥有一组可以处理的对象。
  4. 使用C#的集合和LINQ根据您需要撤消的情况过滤列表。完成后,您将拥有一组已删除所需案例的对象。
  5. 不要担心“最简单”的方式。您需要一种方式。无论你做什么,都要努力工作并担心优化它,以便以后最简单,最快,最小等。

答案 1 :(得分:2)

假设“行”是行并且你逐行读取,你的主要工具应该是string.Split:

foreach (string line in ... )
{
   string [] parts = line.split (';');
   string part3 = parts[2];
   string part15 = parts[14];
   // etc
} 

请注意,如果任何列的内容都包含“;”

,这是一种简单的方法

答案 2 :(得分:1)

您可以使用String.Split两次。

第一次使用“Total 515”;作为使用this overload的拆分字符串。这将为您提供一系列案例。

第二次使用“;”作为每个案例使用this overload的拆分字符。这将为每个案例提供一个数据数组。由于数据一致,您可以提取此数组的3 rd ,15 th 和45 th 元素。

答案 3 :(得分:0)

我会搜索现有的csv库。转义规则可能不容易映射到正则表达式。

如果自己编写一个库,我首先会将每一行解析为一个列表/一个字符串数组。然后在第二步(可能在csv库本身之外)将stringlist转换为强类型对象。

答案 4 :(得分:0)

一种简单但缓慢的方法是从输入(例如StringReader类)中读取单个字符。编写一个读取引号的ReadItem方法,继续读取直到下一个引号,然后查找下一个字符。如果是分号的换行符,则已读取一个项目。如果是另一个引用,请向正在阅读的项目添加单引号。否则,抛出异常。然后使用此方法将输入数据分成一系列项目,每行存储,例如在string[number of items in a row]中,存储在List<>中的行。然后,您可以使用此类读取另一个类中的CSV数据,该类将读取的数据解码为可以从中获取数据的对象。