c#动态加载文件行

时间:2012-10-19 13:44:41

标签: c# file io

我很难想出一个实现文件导入类的好方法,

我希望它能够读取任何文件,然后根据行内容的分隔符确定文件的结构(而不​​是类型结构),

例如,假设我有一个名为A.txt的文件

该文件包含由分隔符

分隔的数据行

结果将是一个字符串数组,如果我要拆分','但是,我如何动态确定分隔符,然后将输出设置为列名?

如果a.txt的第一行是“1,2,3,4,5”

输出应为

delimter : ","
column[0] = "1"
column[1] = "2"
column[2] = "3"
column[4] = "4"
column[5] = "5"

有没有人有什么好主意?并且我不确定,但是有可能以某种方式神奇地确定数据类型可以取决于字符串的值是什么,如果不是这样就好了,但我认为id无论如何都要问。

感谢

4 个答案:

答案 0 :(得分:1)

如果你有一个符号数组,可能是二分符号和第二个符号数组,可能不是二分符号,那么一切都很简单。只需从delimetersArray中找到第一个符号,然后用它来分割。

如果测距之间的部分具有相同的长度,那么这也很容易。

如果部件和分隔符可能是任何部件和分隔符,则无法区分彼此。

答案 1 :(得分:1)

如果您知道数据类型并且分隔符是单个字符来确定分隔符,您可以执行以下操作(伪代码):

char FindDelimiter(string firstLine)
{
    for (int i = 1; i < firstLine.Length; i++)
    {
        if(!CanBeParsedAsKnownDataType(firstLine.SubString(0,i))
        {
            // this one cannot be parsed as a known datatype anymore
            // so it must be the delimiter 
            return firstLine[i];
        }
    }

    // if we reach this, nothing was found
    return '';
}   

请注意,这仅适用于像数字这样的数据类型,其中实际值的子字符串仍然可以解析为数据类型。

答案 2 :(得分:1)

他们没有魔法可用。您所能做的就是遍历第一行并找出最常出现的字符。然后将此列表与可能的分类符候选者列表进行比较,并找出首先出现的那个。

这是一个代码示例,它返回一个字符串,其中包含对字符串的一些分析。也许这是你的“魔法代码”的起点:

var line = "1,2,3,4,5,6";
var analysis = line.GroupBy(c => c);
var results = analysis.OrderByDescending(group => group.Count())
                      .ThenBy(group => group.Key)
                      .Select(group => "The character \""
                                       + group.Key
                                       + "\" appears "
                                       + group.Count()
                                       + " time"
                                       + (group.Skip(1).Any() ? "s" : String.Empty)
                                       + ".");

答案 3 :(得分:0)

你可以试试这个。

 public DataTable GetDataTableFromTextFile(string filepath) 
    {
                                string line;
                                DataTable dt = new DataTable();                         
                                using (TextReader tr = File.OpenText(filepath))
                                {
                                    while ((line = tr.ReadLine()) != null)
                                    {
                                        string[] items = line.Split('\t',":",";","=");
                                        if (dt.Columns.Count == 0)
                                        {
                                            dt.Columns.Add(new DataColumn("FirstColumn", typeof(string)));
                                            dt.Columns.Add(new DataColumn("SecondColumn", typeof(string)));
                                            dt.Columns.Add(new DataColumn("ThridColumn", typeof(string)));

                                        }

                                        if (items.Length > 0 && !string.IsNullOrWhiteSpace(items[0].ToString()))
                                        {
                                            dt.Rows.Add(items);                                       
                                        }
                                    }
                                }
    return dt;

}