如何将.txt文件中的数据转换为xml? C#

时间:2016-07-16 04:10:07

标签: c# database

我在文本文件中有数千行数据,我希望通过将其转换为更易于搜索的内容来轻松搜索(我希望使用XML或其他类型的大型数据结构,但我不确定它是否会对我的想法是最好的。)

每行的数据如下所示:

  

Book 31,Thomas,George,32,34,154

(每本书都不是唯一的,它们是索引,因此书中将列出其中列出的几个不同的条目,并且数字是它们列出的页面)

所以我有点迷失在如何做到这一点,我想读取.txt文件,删除所有的空格和逗号,我基本上得到如何为它准备数据,但我将如何以编程方式制作xml中的许多元素和值还是填充了一些其他大型数据结构?

2 个答案:

答案 0 :(得分:2)

如果您的csv文件没有太大变化且结构稳定,您只需在启动时将其解析为对象列表

private class BookInfo {
    string title {get;set;}
    string person {get;set;}
    List<int> pages {get;set;}
}


private List<BookInfo> allbooks = new List<BookInfo>();

public void parse() {
    var lines = File.ReadAllLines(filename);  //you could also read the file line by line here to avoid reading the complete file into memory
    foreach (var l in lines) {
       var info = l.Split(',').Select(x=>x.Trim()).ToArray();
       var b = new BookInfo {
          title = info[0],
          person = info[1]+", " + info[2],
          pages = info.Skip(3).Select(x=> int.Parse(x)).ToList()
       };
       allbooks.Add(b);
    }
}

然后,您可以使用例如LINQ轻松搜索allbooks列表。

修改

现在,您已经澄清了您的意见,我对解析进行了一些调整以更好地满足您的需求。

如果您想更轻松地通过titleperson搜索图书清单,还可以在每个属性上创建查找

var titleLookup = allbooks.ToLookup(x=> x.title);
var personLookup = allbooks.ToLookup(x => x.person);

所以personLookup["Thomas, George"]将为您提供所有提及“Thomas,George”的书籍列表,titleLookup["Book 31"]将为您提供“Book 31”所有bookinfos的列表,即所有提到的人书。

答案 1 :(得分:1)

如果您希望通过将CSV文件转换为更易于搜索的内容来轻松搜索,则可以将其转换为DataTable。

如果您需要数据,可以使用LINQ to XML进行搜索

以下类生成DataTable或Xml数据格式。您可以传递delimeter,includeHeader或使用默认值:

 class CsvUtility
{
    public DataTable Csv2DataTable(string fileName, bool includeHeader = false, char separator = ',')
    {
        IEnumerable<string> reader = File.ReadAllLines(fileName);
        var data = new DataTable("Table");
        var headers = reader.First().Split(separator);
        if (includeHeader)
        {
            foreach (var header in headers)
            {
                data.Columns.Add(header.Trim());
            }
            reader = reader.Skip(1);
        }
        else
        {
            for (int index = 0; index < headers.Length; index++)
            {
                var header = "Field" + index; // headers[index];
                data.Columns.Add(header);
            }
        }

        foreach (var row in reader)
        {
            if (row != null) data.Rows.Add(row.Split(separator));
        }
        return data;
    }
    public string Csv2Xml(string fileName, bool includeHeader = false, char separator = ',')
    {
        var dt = Csv2DataTable(fileName, includeHeader, separator);
        var stream = new StringWriter();
        dt.WriteXml(stream);
        return stream.ToString();
    }
}

使用示例:

 CsvUtility csv = new CsvUtility();
        var dt = csv.Csv2DataTable("f1.txt");

        // Search for  string in any column  
        DataRow[] filteredRows = dt.Select("Field1 LIKE '%" + "Thomas" + "%'"); 

        //search in certain field
        var filtered = dt.AsEnumerable().Where(r => r.Field<string>("Field1").Contains("Thomas"));


        //generate xml
        var xml=  csv.Csv2Xml("f1.txt");
        Console.WriteLine(xml);
/*
    output of xml for your sample:
   <DocumentElement>
     <Table>
       <Field0>Book 31</Field0>
       <Field1> Thomas</Field1>
       <Field2>George</Field2>
       <Field3> 32</Field3>
       <Field4> 34</Field4>
       <Field5> 154</Field5>
    </Table>
</DocumentElement>

 */