将txt数据转换为由空行分隔的List

时间:2018-01-26 12:08:56

标签: c#

我需要一些帮助,尝试在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,所以我可以稍后链接。

我也想跳过无用的字段。

也许这很简单,但我太过复杂了,如果有人可以提供帮助,我将不胜感激。感谢。

2 个答案:

答案 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