我需要一些帮助,尝试在c#中使用易于搜索的数据转换txt文件。
我的txt文件是这样的:
Field1: Data
Field2: Data
UselessField1: Data
UselessField2: Data
UselessField3: Data
Field3: Data
Field3: Data
Field3: Data
Field4: Data
Field4: Data
Field4: Data
Field1: Data
Field2: Data
UselessField1: Data
UselessField2: Data
UselessField3: Data
Field3: Data
Field4: Data
Field4: Data
Field4: Data
Field4: Data
Fields3和Field4可以有n行,最好分开到其他列表,比如Field1和Fields3,Field1和Fields4,所以我可以稍后链接。
我也想跳过无用的字段。
也许这很简单,但我太过复杂了,如果有人可以提供帮助,我将不胜感激。感谢。
答案 0 :(得分:0)
此代码会将您的数据转换为字典列表,字典将字段名称作为键,数据列表将作为值。
FileStream fs = new FileStream("data.txt", FileMode.OpenOrCreate);
StreamReader r = new StreamReader(fs);
List<Dictionary<string,List<string>>> alldata = new List<Dictionary<string,List<string>>>();
String[] lines = r.ReadToEnd().Split(new string[] { "\r\n" },StringSplitOptions.None);
alldata.Add(new Dictionary<string, List<string>>());
foreach (var item in lines)
{
if (item == "") { alldata.Add(new Dictionary<string, List<string>>()); continue; }
var lst = alldata[alldata.Count - 1];
string key = item.Split(':')[0];
if (key.StartsWith("Useless")) continue;
if (lst.ContainsKey(key))
{
lst[key].Add(item.Split(' ')[1]);
}
else {
lst[key] = new List<string>();
lst[key].Add(item.Split(' ')[1]);
}
}
答案 1 :(得分:0)
首先,我要创建一个具有有意义名称和有意义属性的类:
public class MeaningfulClassName
{
public string Property1 { get; set; }
public string Property2 { get; set; }
public string Property3 { get; set; }
public string Property4 { get; set; }
//...
}
现在,您可以使用LINQ仅过滤文件中的所有相关行,并将键和值拆分为:
。但是,如果您想要一种安全而干净的方法,则需要使用反射和字典来将文本文件字段与类中的属性进行映射。例如:
var myClassType = typeof(MeaningfulClassName);
var allowedProperties = new Dictionary<string, PropertyInfo>
{
{ "Field1", myClassType.GetProperty("Property1") },
{ "Field2", myClassType.GetProperty("Property2") },
{ "Field3", myClassType.GetProperty("Property3") },
{ "Field4", myClassType.GetProperty("Property4") }
};
LINQ查询只选择相同的标记,这些标记也会跳过无用的字段:
var dataLines = File.ReadLines(path)
.Select(l => l.Split(':').Select(t => t.Trim()).ToArray())
.Where(arr => arr.Length == 2 && allowedProperties.ContainsKey(arr[0]));
以下循环读取数据并将类的实例添加到列表中:
var myList = new List<MeaningfulClassName>();
MeaningfulClassName currentObject = null;
foreach (string[] token in dataLines)
{
string fieldName = token[0];
string fieldValue = token[1];
PropertyInfo pi = allowedProperties[fieldName];
// first field specifies the beginning of the next object
if (fieldName == "Field1")
{
if (currentObject != null)
myList.Add(currentObject);
currentObject = new MeaningfulClassName();
}
pi.SetValue(currentObject, fieldValue);
}
if (currentObject != null)
myList.Add(currentObject);
现在您拥有所有对象并可以轻松搜索它们,例如使用LINQ