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

ここで、空行を削除し、複数のスペースを 1 つのスペース文字に置き換える必要があります。ここでは 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 に書き込みます。

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 に答える