【发布时间】:2014-03-22 12:21:29
【问题描述】:
想在 c# 中为任何文本文件的查找创建一个通用的文本文件解析器。实际上我有 4 个应用程序,所有 4 个从 txt 文件格式获取输入数据,但文本文件本质上不是同质的。我已经尝试了 fixwithdelemition。
private static DataTable FixedWidthDiliminatedTxtRead()
{
string[] fields;
StringBuilder sb = new StringBuilder();
List<StringBuilder> lst = new List<StringBuilder>();
DataTable dtable = new DataTable();
ArrayList aList;
using (TextFieldParser tfp = new TextFieldParser(testOCC))
{
tfp.TextFieldType = FieldType.FixedWidth;
tfp.SetFieldWidths(new int[12] { 2,25,8,12,13,5,6,3,10,11,10,24 });
for (int col = 1; col < 13; ++col)
dtable.Columns.Add("COL" + col);
while (!tfp.EndOfData)
{
fields = tfp.ReadFields();
aList = new ArrayList();
for (int i = 0; i < fields.Length; ++i)
aList.Add(fields[i] as string);
if (dtable.Columns.Count == aList.Count)
dtable.Rows.Add(aList.ToArray());
}
}
return dtable;
}
但我觉得它非常僵化,并且确实因应用程序而异,使其可配置。任何更好的方式..
tfp.SetFieldWidths(new int[12] { 2,25,8,12,13,5,6,3,10,11,10,24 });
文件性质: 它是一种报告类型的文件。 列的位置非常相似 文件id不同的行数据。
我把这个作为参考
http://www.codeproject.com/Articles/11698/A-Portable-and-Efficient-Generic-Parser-for-Flat-F
还有其他想法吗?
【问题讨论】:
-
感谢编辑 :)
-
不是我的领域,但我猜如果你有 4 种不同的 txt 格式,你可以有 4 个不同的 int 数组来输入 tfp.SetFieldWidths()。也许您应该编写一个例程,找出您正在处理的 4 种文本类型中的哪一种,然后调用 FixedWidthDiliminatedTxtRead 传递一个 int[] 参数,其中列号和长度已经定义...
-
您可以使用 CSV 解析器组件,而不是自己编写代码。有关一些选项,请参阅stackoverflow.com/questions/316649/csv-parsing。
-
看看 FileHelpers 库 - filehelpers.com。即使您不想使用它,它也是一个已经存在多年的可靠库,您可以从中获得一些好主意。
标签: c# asp.net .net generics text-parsing