在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行是空白行。
我如何从这个创建所需的字典?
提前感谢。
问候。
要将文件解析为,例如,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]);
}
}