如何在CSV中将多行聚合为一个?

时间:2014-11-20 12:44:53

标签: parsing csv scripting aggregate

我有以下问题:
我有一个CSV文件,如下所示:

  

1,12
  1,15
  1,18
  2,10
  2,11
  3,20

我想以某种方式解析它:

  

1,12,15,18
  2,10,11
  3,20

你有解决方案吗?谢谢!

3 个答案:

答案 0 :(得分:0)

我不知道您的确切代码要求。我会尝试写一些可以帮助你的逻辑!

  1. CSV表示我可以读入字符串或数组的文本文件
  2. 如果要查看上面的CSV数据,就会有一个共同的模式,即每对之后都有一个空格。
  3. 所以我的解析将取决于两个阶段
    • 解析' '即单个空格并将插入一个数组(比如元素)
    • 然后解析','即来自元素的每个元素的逗号并保存到另一个数组(比如细节),其中奇数索引将包含左手值,偶数索引将包含右手值。
  4. 所以接下来打印或使用跳过奇数索引,如果你有一个现有值。

    希望这会有所帮助......

答案 1 :(得分:0)

Satyaranjan,
感谢您的回答!澄清 - 我没有任何代码要求,我可以使用任何语言来实现结果。重点是从第一个位置(1,2,3)获取唯一值,并将所有相关数字放在右侧(1 - 12,15和18等)。
它类似于MySQL中的GROUP_CONCAT功能 - 但不幸的是我没有这样的功能,所以我正在寻找一些解决方法。
希望现在更清楚了。感谢

答案 2 :(得分:0)

这是一个适合您的解决方案。

第一部分只是设置了测试示例。我假设您已经在脚本的第二部分中有一个包含值的文件。

$path = "$env:TEMP\csv.txt"

$data =@"
1,12
1,15
1,18
2,10
2,11
3,20
"@

$data | Set-Content $path

这应该是你所需要的:

$path = "$env:TEMP\csv.txt"
$results = @{}

foreach($line in (Get-Content $path))
{
    $split = $line -split ','
    $rowid = $split[0]
    $data = $split[1]
    if(-not($results.$rowid))
    {
       $results.$rowid = $rowid
    }
    $results.$rowid += "," + $data
}

$results.values | Sort-Object

您的原始数据集无需进行排序即可使用此数据集。我将数据切片并将其插入哈希表。