我有一个逗号分隔格式的文本文件。每行有两列,每列都有整数值。像
12334,23433
23234,45663
234422,324545
324543,23433
143233,23433
.....
重复第二列中的值。我需要完成的是找到第一列中第二列具有相同值并在一行中表示它们的所有值。与上述数据一样:
23433 12334,324543,143233
45663 23234
324545 234422
我所做的是:
这肯定花了太多时间。我用C#编写了代码。 T-SQL中的任何解决方案都可以正常工作。
任何优化它的帮助。
答案 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