从c#中的文件中读取唯一元素

时间:2013-02-23 19:12:39

标签: c#

我有一个文件

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将是其列元素。 请帮忙。

2 个答案:

答案 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]);
        }
    }
}

这就是全部。我已经在你的例子上测试了它,它对我有用。