[英]How would I convert data in a .txt file into xml? c#
我想通過將文本文件轉換成易於搜索的內容來使文本文件中的數千行數據易於搜索(我希望XML或其他類型的大型數據結構,盡管我不確定它是否會是最好的對於我的想法)。
每行的數據如下所示:
書籍31,托馬斯·喬治,32,34,154
(每本書不是唯一的,它們是索引,因此本書將在其中列出幾個不同的條目,而數字是列出的頁面)
因此,我對如何執行此操作有些迷失,我想讀取.txt文件,刪去所有空格和逗號,基本上可以得到准備數據的方法,但是我將如何以編程方式制作這么多元素和xml中的值還是填充其他大型數據結構?
如果您的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
列表。
編輯
現在,您已經澄清了輸入內容,我對解析進行了一些調整,以更好地滿足您的需求。
如果要按title
或person
更輕松地搜索書目,還可以在每個屬性上創建一個查找
var titleLookup = allbooks.ToLookup(x=> x.title);
var personLookup = allbooks.ToLookup(x => x.person);
因此personLookup["Thomas, George"]
將為您提供所有提及“ Thomas,George titleLookup["Book 31"]
的列表,而titleLookup["Book 31"]
將為您提供有關“ Book 31”的所有書信息的列表,即所有提及的人在那本書中。
如果希望通過將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>
*/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.