在c#中从具有已定义结构的文本文件创建字典

本文关键字:结构 文本 文件创建 字典 定义 | 更新日期: 2023-09-27 18:08:01

我有一个包含以下信息的文本文件:

01 Index
home
about
02 Home
first
second
third

以数字开头的行表示键,其后直到空行为值。

我想有一个Dictionary对象,其中键作为第一行,它之后的行直到空白行作为字符串数组表示。

一样:

key = "01 Index"
value = string[]

,其中数组中的值为:

string[0] = "home"
string[1] = "about"

下一个键将是"02 Home"及其后面的行作为字符串[]。

这个方法读取文本文件:

string[] ReadFileEntries(string path)
{
   return File.ReadAllLines(path);
}

这给出了字符串[]中的所有行,上面的示例中有8行,其中第4行是空白行。

我如何从这个创建所需的字典?

提前感谢。

问候。

在c#中从具有已定义结构的文本文件创建字典

要将文件解析为,例如,Dictionary<String, String[]>,您可以这样做:

  Dictionary<String, String[]> data = new Dictionary<String, String[]>();
  String key = null;
  List<String> values = new List<String>();
  foreach (String line in File.ReadLines(path)) {
    // Skip blank lines
    if (String.IsNullOrEmpty(line))
      continue; 
    // Check if it's a key (that should start from digit)
    if ((line[0] >= '0' && line[0] <= '9')) { // <- Or use regular expression
      if (!Object.ReferenceEquals(null, key))
        data.Add(key, values.ToArray());
        key = line;
        values.Clear();
        continue;
    }
    // it's a value (not a blank line and not a key)
    values.Add(line);
  }
  if (!Object.ReferenceEquals(null, key))
    data.Add(key, values.ToArray());

这应该做你想做的事情。还有改进的空间,我建议稍微重构一下。

var result = new Dictionary<string, string[]>();
var input = File.ReadAllLines(@"c:'temp'test.txt");
var currentValue = new List<string>();
var currentKey = string.Empty;
foreach (var line in input)
{
    if (currentKey == string.Empty)
    {
        currentKey = line;
    }
    else if (!string.IsNullOrEmpty(line))
    {
        currentValue.Add(line);
    }
    if (string.IsNullOrEmpty(line))
    {
        result.Add(currentKey, currentValue.ToArray());
        currentKey = string.Empty;
        currentValue = new List<string>();
    }
}
if (currentKey != string.Empty)
{
    result.Add(currentKey, currentValue.ToArray());
}

我们用这种方式声明一个字典:

Dictionary<string, string[]> myDict = new Dictionary<string, string[]>()

填充它,我们这样做:

myDict.Add(someString, someStringArray[]);

我想这样做就可以了:

string[] TheFileAsAnArray = ReadFileEntries(path);
Dictionary<string, string[]> myDict = new Dictionary<string, string[]>()
string key = "";
List<string> values = new List<string>();
for(int i = 0; i <= TheFileAsAnArray.Length; i++)
{
    if(String.isNullOrEmpty(TheFileAsAnArray[i].Trim()))
    {
          myDict.Add(key, values.ToArray());
          key = String.Empty;
          values = new List<string>();
    }
    else
    {
        if(key == String.Empty)
            key = TheFileAsAnArray[i];
        else
            values.Add(TheFileAsAnArray[i]);
    }
}