找到1000万行的记录

时间:2013-02-10 17:01:50

标签: c# sql-server tsql large-data

我有一个逗号分隔格式的文本文件。每行有两列,每列都有整数值。像

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

重复第二列中的值。我需要完成的是找到第一列中第二列具有相同值并在一行中表示它们的所有值。与上述数据一样:

23433 12334,324543,143233
45663 23234
324545 234422

我所做的是:

  1. 使用逗号(,)作为导入的文本文件到SQL Server表中 分隔符。
  2. 从每行代码中读取文本文件。
  3. 以逗号(,)为基础拆分行,并使用第二列值发送 查询SQL表。
  4. 将结果存储在键为第二列的字典数据结构中 并从第一列值连接所有结果。
  5. 完成所有处理后,遍历字典并将其写入文件中。
  6. 这肯定花了太多时间。我用C#编写了代码。 T-SQL中的任何解决方案都可以正常工作。

    任何优化它的帮助。

3 个答案:

答案 0 :(得分:3)

只要数据很小,在纯C#中执行此操作应该快速而简单。无需将CSV文件拖入SQL数据库。

只要文件适合您的RAM,最大的成本应该是IO,而不是处理。有1000万行,该文件应该有大约100 MB,并且可能需要一秒钟来处理。

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

答案 1 :(得分:1)

只需使用order by来处理一个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());

答案 2 :(得分: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