0

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

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. 全部处理完毕,遍历字典,写入文件。

这肯定需要太多时间。我已经用 C# 编写了代码。T-SQL 中的任何解决方案都可以使用。

任何帮助优化它。

4

3 回答 3

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);
于 2013-02-10T17:23:54.427 回答
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());
于 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 回答