如何根据文本字符串将 CSV 文件拆分为多个文件?

Kur*_*eno 6 csv microsoft-excel

我有多个文本文件 (CSV),其结构类似于:

funkiana,23.55,-99.866
funkiana,24.634,-98.701
funkiana,24.717,-98.901
geminiflora,22.25,-104.6166667
geminiflora,21.21666667,-104.65
horrida,19.633,-97.367
horrida,23.61666667,-102.575
horrida,22.158,-100.979
horrida,19.506,-97.433
horrida,17,-97.56667
horrida,19.485,-97.263
horrida,19.017,-99.133
horrida,19.017,-99.15
horrida,18.91,-99.23
horrida,17.82167,-100.26333
horrida,19.507,-97.438
inaequidens,19.399,-99.314
inaequidens,23.58333,-105.8833
inaequidens,19.767,-103.7
inaequidens,20.787,-103.848
Run Code Online (Sandbox Code Playgroud)

如您所见,共有三个字段(物种、纬度和经度)。现在,我想将每个 CSV 文件拆分为不同的 CSV 文件,仅包含每个物种的数据。换句话说,我想要一个文件用于所有出现的funkiana(经纬度),另一个文件geminiflora(经纬度)等等。

关于如何做到这一点的任何想法?也许使用脚本或 Excel 宏?

nix*_*xda 8

我能想到的最快方法是使用 PowerShell

$fullpath = "D:\myFolder\input.csv"

$path = Split-Path $fullpath -parent
$data = Import-CSV -Delimiter "," -Path $fullpath -Header species,latitude,longitude  

foreach ($group in $data | Group species){        
    $data | Where-Object {$_.species -eq $group.name} | 
        ConvertTo-Csv -NoTypeInformation | 
        foreach {$_.Replace('"','')} | 
        Out-File "$path\$($group.name).csv"     
}
Run Code Online (Sandbox Code Playgroud)
  1. 将代码粘贴到一个新的文本文件并将其保存为例如 MySplitMacro.ps1
  2. 编辑第一行并更改$fullpath为所需的 CSV 路径
  3. 右键单击该.ps1文件,然后单击使用 PowerShell 运行

以您的初始示例作为输入,脚本将在与输入文件相同的位置创建 4 个新的 CSV 文件。当按第一列过滤时,每个 CSV 将包含一组条目。

结果示例文件夹
在此处输入图片说明

一个结果示例文件
在此处输入图片说明

调整

  • 变化的物种$data | Group species的列设置为过滤器
  • 更改-Delimiter ","输入文件是否具有不同的分隔符,如制表符“`t”或分号“;”
  • 更改-Header species,latitude,longitude为您的列名称。正确订购
  • $path\$($group.name).csv如果需要不同的输出路径,请更改
  • 相反的-eq $group.name筛选结果,你也可以使用-like *$group.name*通配符比较或-match '[A-Z]$group.name'正则表达式比较

使用的资源