确定输入文件是否可由程序使用

时间:2014-04-22 21:58:52

标签: c# parsing text-files

我有一个C#程序,可以查看.txt文件的目录,并将每个文件加载到DataTable

static IEnumerable<string> ReadAsLines(string fileName)
{
    using (StreamReader reader = new StreamReader(fileName))
        while (!reader.EndOfStream)
            yield return reader.ReadLine();
}

public DataTable GetTxtData()
{
    IEnumerable<string> reader = ReadAsLines(this.File);

    DataTable txtData = new DataTable();

    string[] headers = reader.First().Split('\t');

    foreach (string columnName in headers)
        txtData.Columns.Add(columnName);

    IEnumerable<string> records = reader.Skip(1);

    foreach (string rec in records)
        txtData.Rows.Add(rec.Split('\t'));

    return txtData;
}

这适用于常规制表符分隔文件。 然而,问题是,我需要使用的文件夹中的每个.txt文件都不包含制表符分隔的数据。一些.txt文件实际上是SQL查询,备注等已保存为纯文本文件,我无法事先确定。试图在这些文件上使用上述代码显然不会产生预期的结果。

所以我的问题是这样的:在尝试使用上面的代码将其读入DataTable之前,如何确定.txt文件是否实际包含制表符分隔的数据?

仅搜索文件中的任何制表符都不起作用,例如,保存为纯文本的SQL查询可能包含代码格式标签。

任何指导都非常感谢!

2 个答案:

答案 0 :(得分:0)

如果每行包含相同数量的元素,则只需读取每一行,并验证每个记录中的字段数是否正确。如果没有错误。

if (headers.Count() != CORRECTNUMBER) 
{
    // ERROR
}

foreach (string rec in records)
{
    string[] recordData = rec.Split('\t');
    if (recordData.Count() != headers.Count())
    {
         // ERROR
    }

    txtData.Rows.Add(recordData);
}

答案 1 :(得分:0)

要做到这一点,你需要一套&#34;签名&#34;逻辑提供者可以检查文件的给定样本&#34;签名&#34;内容。这与病毒扫描程序的工作方式类似。

考虑您将创建一组类,其中ISignature由一组类实现;

class TSVFile : ISignature
{
    enumFileType ISignature.Evaluate(IEnumerable<byte> inputStream);
}

class SQLFile : ISignature
{
    enumFileType ISignature.Evaluate(IEnumerable<byte> inputStream);
} 

每个人都会读取适当数量的字节并返回已知的文件类型(如果可以进行评估)。每个文件解析器都需要自己的逻辑来确定要读取的字节数以及进行评估的基础。