设计中间数据文件的格式?

时间:2012-12-19 21:30:45

标签: java python r

我们正在从数据库向Excel文件转储大量数据(按体积而非频率,即一次性转储100K或> 400MB记录)。转储过程目前正在Python,R和Java中执行(使用POI库)。作为转储过程的一部分,我们将数据库中的数据读取到中间文件(管道分隔的文本文件),然后由代码选取更新excel文件。最近,我们遇到了这样的问题,即带有换行符的数据库中的文本导致管道定界文件无效,因为1条记录跨越多行,而不是只有一行。例如,

| Col1 | Col2 | Col3 |  
| Val  | Val2 | Val3 |

是管道分隔文件的有效示例。如果数据包含任何新行,则:

| Col1 | Col2 | Col3 |
| Val1


| Val2 | Val3 


|

这种情况变得越来越难以捕捉并导致需要进行更多编码才能进行此类检查。

我想知道是否有任何库/技术可以用来写出这样的临时数据。考虑到性能可能成为如此大量数据的问题,我不确定XML是否会成为解决方案。 JSON可能看起来更合适,但后来我不知道我的所有选择。

1 个答案:

答案 0 :(得分:2)

如果列数始终保证相同,这只是csv的一个奇怪的方言,您应该能够使用Python中的csv模块进行解析,我怀疑Java(但也许而R)在内置或易于使用的库中具有类似的功能。

或者,如果您由于某种原因自己编写了解析器,那么扩展它们以处理换行应该很容易。例如,不是在|读取一行并拆分并假设您已获得所有字段,而是读取一行,在|上拆分,计算您是否有足够的字段,以及如果没有读下一行并追加并重试。但是,使用已经编写和测试过的代码比尝试自己编写代码要好得多。

(当然如果字段可以包含|个字符,那么这种格式是不明确的,并且不能被任何东西解析,除非你以某种方式逃避它们。)

另一个选择是在一端引用或转义换行符(以及其他特殊字符),并在另一端转换它们。同样,这是任何体面的csv库将为您做的事情(几乎无论您是否想要它)。

你可能想考虑使用准标准的csv方言(通常意思是&#34;由Excel的默认值&#34;定义),而不是提出类似但不相同的自定义格式。< / p>

使用标准csv方言的一个明显优势是Excel可以直接读取结果,这可能需要从长链中取出一层。 (当然,通过使用Excel的数据访问功能,只需导入或前置实际数据库,您就可以使用更多层。)

如果您想要更改为JSON,那么您没有理由不这样做。但在这里似乎没有任何令人信服的理由。当您拥有灵活的动态记录类型时,JSON(或类似的东西,如YAML)绝对是您的选择。但是当你反复重复静态记录类型时,JSON意味着一遍又一遍地重复这些字段的名称。它没有XML那么糟糕,但它仍然是创建,传递和解析的额外信息,没有真正的好处。

所以,我认为这里的正确答案是:如果可能的话,Excel风格的csv,你自己独特的csv方言,如果由于某种原因不可能,如果处理换行符就会增加一条规则。