是否可以在不知道每列宽度或列名并将其转换为 CSV 的情况下解析固定宽度文件?

Is it possible to parse a fixed width file without knowing the width of each column or the column names and converting it to a CSV?

我想知道是否可以解析 任何 固定宽度文件而无需对其进行任何了解并将其制作成 CSV。我的直觉说不,因为可能会有一些边缘情况。如果您知道宽度,但不知道列名,那很好。如果您知道列名,那么您就可以计算出宽度,这样就可以了。但是,如果您两者都没有,我可以想象,如果您在真正开始解析之前阅读文件一次,那么如果您使用足够聪明的逻辑,您就可以做到这一点。 也许。但如果这也是一个约束(必须读取文件一次),那么你就不走运了,对吗?还假设这是流式传输,因为文件为 50GB,无法加载到内存中。所以,回顾一下我的目标和限制:

目标:成功转换没有相关信息的固定宽度文件,最明显的是列名和宽度长度

约束条件: 1.我希望文件很大,所以我必须流式处理而不是将其加载到内存中,读取两次效率非常低。 2. 我没有关于列名、宽度或任何其他信息 - 我只是收到一个固定宽度的文件。

考虑到这些限制,目标是否可能实现?我知道在简单的情况下,可以这样说:

Love    Lucy    Is    Awesome    
data    datatat datad datadaa

好吧,随便吧。因为列名中没有任何 space,所以很容易。但是我真的想不通的是像这样的复杂情况:

The   Swimming Pool  Is    Dirty
data  data           data  data
data  datada   data  data  data

在查看文件之前,我永远无法知道 "Swimming Pool " 是一列还是 "Swimming " 和 "Pool " 是两列。如果我所有的行都表示四条记录,那么 "Swimming Pool " 是一列;五,然后他们是两列。

事实上,这只是一个假设;也许 "Pool " 总是空的。我的意思是,即使是这种情况:

Swimming Pool  
datadatadatat

我对定宽文件的了解还不够多,但两条记录之间至少必须有一个 space 吗?这可以翻译为:

Swimming, Pool
datadatad,atat

所以,我的难题向你展开了。老实说,我什至不确定简单的案例是否真的简单。也许 Lucy Is . 是一列。第一次接触这种文件类型(甚至真的听说过)吧,希望专业人士给点意见。

!!!

只能通过这种方式传递最简单的定宽文件。 固定宽度的文件可以

  • 有多个记录布局
  • 二进制字段
  • 可能是 Cobol 文件
  • 对于某些字段,您需要知道正确的字段定义是什么 解释它们。例如可以假定小数点,即 12345 可以是 123.45, 1.2345 等等
  • 文本字段通常左对齐,

对于固定宽度的文件,您需要一个文件描述 (chema)

Cobol 文件

固定宽度文件的一个常见来源是 Cobol 应用程序。 Cobol 固定宽度文件

  • 从来没有列标题
  • 字段之间一般没有space
  • 可以有二进制字段
  • 假定小数点
  • 分区十进制

看看这个问题中的文件

软件

  • Microsoft Excel / Access + 大多数电子表格都有固定宽度的导入向导
  • RecordEditor/Recsveditor 有固定宽度文件的向导 + 可以编辑固定宽度文件