-1

我有一个文件

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

我想将它存储在字典中,因为键值对键将是我的行元素。value 将是它的列元素。请帮忙。

4

2 回答 2

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);
    }
}
于 2013-02-23T19:23:01.377 回答
0

好的,所以首先你必须加载文件内容:

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

就这样。我已经在您的示例中对其进行了测试,并且对我有用。

于 2013-02-23T20:12:44.780 回答