-1

ある行の配列の 0 インデックスと次の行の 0 インデックスの値を比較しようとしています。最初の列に一意の識別子があり、2 番目の列に対応する値がある CSV を想像してください。

USER1, 1P
USER1, 3G
USER2, 1P
USER3, 1V

[0] の値を次の行 (より簡単な場合は前の行) で比較し、それらが同じ場合 (例のように) をインデックス 1 に連結します。つまり、データは読み取る必要があります。なので

USER1, 1P, 3G
USER2, 1P
USER3, 1V

次の関数に渡される前に。これまでのところ、

 private void csvParse(string path)
        {
            using (TextFieldParser parser = new TextFieldParser(path))
                {
                    parser.Delimiters = new string[] { "," };
                    while (!parser.EndOfData)
                    {
                        string[] parts = parser.ReadFields();
                        if (parts == null)
                        {
                            break;
                        }
                        contact.ContactId = parts[0];
                        long nextLine;
                        nextLine = parser.LineNumber+1;
//if line1 parts[0] == line2 parts[0] etc.
                    }
                }
            }

誰か提案はありますか?ありがとうございました。

4

4 に答える 4

1

私があなたを正しく理解していれば、あなたが求めているのは、基本的に「最初の列の値に基づいて 2 番目の列の値をグループ化するにはどうすればよいですか?」ということです。

これを行うための迅速で非常に簡潔な方法は、LINQ を使用してグループ化することです。

var linesGroupedByUser =
    from line in File.ReadAllLines(path)
    let elements = line.Split(',')
    let user = new {Name = elements[0], Value = elements[1]}
    group  user by user.Name into users
    select users;

foreach (var user in linesGroupedByUser)
{
    string valuesAsString = String.Join(",", user.Select(x => x.Value));

    Console.WriteLine(user.Key + ", " + valuesAsString);
}

クラスの使用を省略しましたTextFieldParserが、代わりに簡単に使用できます。ただし、このアプローチでは、すべてのデータをメモリにロードする余裕が必要です。これが実行可能かどうかについては言及していません。

于 2016-03-31T20:39:23.203 に答える
0

基本的にすべての一意のエントリを見つけているので、連絡先 ID をキーとしてそれらを辞書に入れます。次のように:

 private void csvParse(string path)
    {
        using (TextFieldParser parser = new TextFieldParser(path))
        {
            parser.Delimiters = new string[] { "," };
            Dictionary<string, List<string>> uniqueContacts = new Dictionary<string, List<string>>();
            while (!parser.EndOfData)
            {
                string[] parts = parser.ReadFields();
                if (parts == null || parts.Count() != 2)
                {
                    break;
                }
                //if contact id not present in dictionary add
                if (!uniqueContacts.ContainsKey(parts[0]))
                    uniqueContacts.Add(parts[0],new List<string>());
                //now there's definitely an existing contact in dic (the one 
                //we've just added or a previously added one) so add to the                   
                //list of strings for that contact
                uniqueContacts[parts[0]].Add(parts[1]);
            }

            //now do something with that dictionary of unique user names and
            // lists of strings, for example dump them to console in the 
            //format you specify:

            foreach (var contactId in uniqueContacts.Keys)
            {

                var sb = new StringBuilder();
                sb.Append($"contactId, ");
                foreach (var bit in uniqueContacts[contactId])
                {
                    sb.Append(bit);
                    if (bit != uniqueContacts[contactId].Last())
                        sb.Append(", ");
                }
                Console.WriteLine(sb);
            }
        }
    }
于 2016-03-31T20:33:31.637 に答える