0

コンマ区切り形式のテキスト ファイルがあります。各行には 2 つの列があり、各列には整数値があります。お気に入り

12334,23433
23234,45663
234422,324545
324543,23433
143233,23433
.....

2 列目の値が繰り返されます。私が達成する必要があるのは、2番目の列が同じ値を持つ最初の列のすべての値を見つけて、それらを行で表すことです。上記のデータのように:

23433 12334,324543,143233
45663 23234
324545 234422

私がやったことは次のとおりです。

  1. コンマ (,) を区切り文字として使用して、テキスト ファイルを SQL Server テーブルにインポートしました。
  2. 行ごとにコードからテキスト ファイルを読み取ります。
  3. カンマ (,) に基づいて行を分割し、2 番目の列の値を使用してクエリを SQL テーブルに送信します。
  4. キーが 2 番目の列であるディクショナリ データ構造に結果を格納し、最初の列の値からすべての結果を連結します。
  5. すべての処理が終了したら、辞書をたどってファイルに書き込みます。

これは間違いなく時間がかかりすぎています。C# でコードを記述しました。T-SQL のソリューションも同様に機能します。

それを最適化するための助け。

4

3 に答える 3

3

データが小さい限り、純粋な C# でこれを行うと、高速かつ簡単になります。CSV ファイルを SQL データベースにプルする必要はありません。

ファイルが RAM に収まる限り、最大のコストは IO であり、処理ではありません。1,000 万行の場合、ファイルは約 100 MB になり、処理におそらく 1 秒かかります。

var lines = File.ReadLines(inputFilename);

var table = lines.Select(line => line.Split(','));
var groups = table.GroupBy(columns => columns[1]);
var output = groups.Select(g => g.Key + " " + string.Join(",", g.Select(columns=>columns[0])));

File.WriteAllLines(outputFilename, output);
于 2013-02-10T17:23:54.427 に答える
1

order byを使用して、一度に1つのcol2を処理するだけです。

select col1, col2 
from table  
order by col2, col1

次に、col2の新しい値を取得したら、その行を書き出します。

Int col2Last = 0;  // assume 0 is not a valid value
StringBuilder sb = new string builder();

    while (rdr.read());
    {
        col1 = rdr.GetInt(0);
        col2 = rdr.GetInt(1);
        if(col2 != col2Last and col2Last !=0)
        {
             Console.WriteLine(col2Last.ToString() + " " + sb.ToString());
             sb.clear();
        }
        if (sb.Lenght > 0) sb.Append(",");
        sb.Append(col1.ToString());
        col2Last = col2;
    }
    Console.WriteLine(col2Last.ToString() + " " + sb.ToString());
于 2013-02-10T17:15:03.007 に答える
0

まだデータをテーブルにインポートしている場合は、次の方法を試してみてください。

declare @t table(c1 int, c2 int)
insert into @t values
(12334,23433),
(23234,45663),
(234422,324545),
(324543,23433),
(143233,23433)

select c2, replace((select cast(c1 as varchar) as 'data()' from @t where c2=t.c2 for xml path('')),' ',', ')
from 
@t t
group by c2 
于 2013-02-11T16:21:19.120 に答える