1

我得到了一个 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
    . 现在这很糟糕

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

提前致谢!

4

2 回答 2

3

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

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

因此,您从 Start 状态开始。在 Start 状态下,如果您看到报价,则进入 QuotedField 状态。如果您看到一个字母或数字,您将进入 UnQuotedField 状态。如果您看到一个逗号,您将进入 EndField 状态(即,您只是读取一个空字段)。如果您看到很多其他内容,您将进入错误状态。

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

于 2010-08-12T22:18:12.037 回答
1

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

于 2010-08-16T08:17:00.927 回答