我有一个文件
outlook temperature Humidity Windy PlayTennis
sunny hot high false N
sunny hot high true N
overcast hot high false P
rain mild high false P
rain cool normal false P
我想只读取每列中的唯一元素。
我的输出应该是:
elements: occurence
sunny : 2
overcast :1
rain : 2
hot: 3
cold : ans so on
mild
high
normal
true
false
N
P
我想将它存储在字典中,作为键值对 key将是我的row元素。 value将是其列元素。 请帮忙。
答案 0 :(得分:0)
只需为每个列创建一个HashSet,并将其下的值存储在相应的HashSet中。完成将所有元素全部添加到HashSet后,打印每个HashSet中的所有元素。
var text1 = File.ReadAllLines(file);
HashSet<string>[] columns = new HashSet<string>[text1[0].Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Length];
for(int i=0; i<columns.Length; i++)
{
columns[i] = new HashSet<string>();
}
foreach (string row in text1.Skip(1))
{
string[] words = row.Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
if (words.Length == columns.Length)
{
for (int i = 0; i < words.Length; i++)
{
columns[i].Add(words[i]);
}
}
}
for (int i = 0; i < columns.Length; i++)
{
foreach (string value in columns[i])
{
Console.WriteLine(value);
}
}
答案 1 :(得分:0)
Okey,首先你需要加载文件内容:
string[] allLines = File.ReadAllLines(filePath);
现在,您应该删除空行并用单个空格字符替换多个空格。 Regex和Linq在这里派上用场。
string[] nonEmptyLines = allLines.Where(s => s.Trim(' ') != "")
.Select(s => Regex.Replace(s, @"\s+", " ")).ToArray();
现在让我们阅读列标题:
string[] columnHeaders = null;
if (nonEmptyLines.Length > 0)
columnHeaders = nonEmptyLines[0].Split();
else
return;
检查有多少列:
int columnsCount = columnHeaders.Length;
跳过包含列标题的第一行,并使用以下Linq语法将值拆分为字符串数组。
var linesValues = nonEmptyLines.Skip(1).Select(l => l.Split());
最后,是时候将独特的结果写入词典了:
Dictionary<string, string> columnValues = new Dictionary<string, string>();
for (int i = 0; i < columnsCount; i++)
{
foreach (string[] values in linesValues)
{
if (!columnValues.ContainsKey(values[i]))
{
columnValues.Add(values[i], columnHeaders[i]);
}
}
}
这就是全部。我已经在你的例子上测试了它,它对我有用。