使用Delphi处理CSV文件

时间:2010-08-12 21:41:04

标签: delphi csv delphi-2005

我已经得到了一个CSV文件,据说有七列,直到最近我做得很好,他们开始在第三个数据列中使用逗号,还有CR和LF字符,也在第三列内,所有这些在双引号之间。

我是逐行阅读的,所以我可以用另一个文件对它进行交叉检查,并将其指向另一个文件中的右行,但现在它们包含新的行代码和逗号,我的代码是搞砸了。

例如:

  1. 1,4778,"El murciélago estaba navegando",10/08/2010,906610,13496-86219-1,1。这个运行得很好。

  2. 1,4778,"El murciélago estaba navegando,
    y además estaba de parranda",10/08/2010,906610,13496-86219-1,1
    。现在这是

  3. 你建议解决这个问题吗?第三个数据列始终是具有这些突然变化的数据列。其他人永远不会使用新行或额外的逗号,所以没有必要过滤那些...

    提前致谢!

2 个答案:

答案 0 :(得分:3)

处理它的最干净,最系统的方法可能是逐个字符地读取并使用一个小状态机来处理诸如“我们在引用的字符串中,所以忽略任何逗号,CR或LF”之类的事情。

执行此操作的一种方法是构建一个数组,其中每一行都是当前状态,每列都是可能的输入字符。您读取输入字符,并根据当前状态和输入字符,获得下一个要输入的状态。您通常还会有一个case语句来根据当前状态和下一个状态执行操作(例如,当您读取的内容被允许作为字段的一部分时,将当前字符附加到CurrentField字符串) ,或者到达字段末尾时保存当前字段字符串。

因此,您从“开始”状态开始。在“开始”状态中,如果看到引号,则转到QuotedField状态。如果看到字母或数字,则转到UnQuotedField状态。如果看到逗号,则转到EndField状态(即,您只读取一个空字段)。如果您看到其他任何内容,则会转到错误状态。

在QuotedField状态中,接受除引号之外的任何内容,并使您处于QuotedField状态。当您看到引号时,您需要检查下一个字符是否为引号(双引号转换为嵌入字段中的引号)或其他内容(意味着引号标记为字段的结尾)。您可以通过手动编写一些代码来查看下一个输入字符,并检查它是否为引号,或者您可以编码另一个返回QuotedField状态的状态(如果它获得引号),EndField状态如果它找到逗号,或几乎任何其他东西的错误状态(例如,字母或数字)。

答案 1 :(得分:1)

这几乎是未知的,但BDE可以读取CSV文件 - 它只需要一个定义文件来告诉它文件的格式。如何使用它在BDE文档中。