我在文本文件中有数千行数据,我希望通过将其转换为更易于搜索的内容来轻松搜索(我希望使用XML或其他类型的大型数据结构,但我不确定它是否会对我的想法是最好的。)
每行的数据如下所示:
Book 31,Thomas,George,32,34,154
(每本书都不是唯一的,它们是索引,因此书中将列出其中列出的几个不同的条目,并且数字是它们列出的页面)
所以我有点迷失在如何做到这一点,我想读取.txt文件,删除所有的空格和逗号,我基本上得到如何为它准备数据,但我将如何以编程方式制作xml中的许多元素和值还是填充了一些其他大型数据结构?
答案 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
列表。
修改
现在,您已经澄清了您的意见,我对解析进行了一些调整以更好地满足您的需求。
如果您想更轻松地通过title
或person
搜索图书清单,还可以在每个属性上创建查找
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>
*/