存储分隔文本文件架构的最佳实践

Posted

技术标签:

【中文标题】存储分隔文本文件架构的最佳实践【英文标题】:Best practices for storing the schema of delimited text files 【发布时间】:2012-11-30 16:41:36 【问题描述】:

我正在编写一个程序来解析几个分隔的平面文件,它需要其中的几个列。如果将来输入平面文件的格式发生变化,我不确定使我的代码易于维护/更新的最佳方法。

目前我有一组常量整数形式(还有很多):

NameListFirstNameCol = 0; 
NameListLastNameCol = 1; 
NameListAgeCol = 2; 
ClassListRoomNumCol = 0; 
ClassListRoomNameCol = 1;

以及用于分隔符的常量,例如:

NameListDelim = ',';
ClassListDelim = '\t';

我想看看是否有人对跟踪此类信息的更好方法提出建议。 (我可以假设我需要的列总是在输入中,但输入的创建者可能会更改分隔符、添加新列或重新排序列)。这是一个数据分析脚本,它会看到一些重用,但不是生产软件的主要部分。

【问题讨论】:

我喜欢在 cmets 中保留一个样本输入以便于验证 【参考方案1】:

这里有一些有趣的信息:

Importing CSV file into Database with Schema.ini

尤其是每次都使用不同的 CSV 文件名导入 CSV 文件或 动态创建 Schema.ini 文件看起来很有希望。

【讨论】:

【参考方案2】:

首先,您必须从文件中创建一个包含字段名称和相应索引的列表。 例如 Dictionary 用于保留您可以从文件第一行读取的名称。拥有列名和相应索引的列表后,您可以使用 string.Split 仅使用您需要的索引来解析后续行。 此外,您还必须存储结构所需的列列表。为了便于维护,您可以将其作为单独的 .cs 文件中的单独类保存。

【讨论】:

【参考方案3】:

我编写了一个名为 JRecordBind 的库,它使用 XML Schema 描述平面文件的结构。见one of the examples。

不幸的是,它是用 Java 编写的。你可以考虑移植它。要是有 C# 版本就好了

【讨论】:

以上是关于存储分隔文本文件架构的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

逐行迭代文本文件的内容 - 是不是有最佳实践? (与 PMD 的 AssignmentInOperand 相比)

将文本输出写入 S3 存储桶的最佳实践是啥?

带有管道分隔文件的 Netezza 合并表

读取由空格分隔的值的多行文本

从应用程序中存储的文本文件中读取数据的最佳方式

逗号分隔的文本文件到通用列表