如何使用PowerShell将多个.txt文件合并为多列.csv文件
多个ASD文本文件合并为CSV(保留波长列,多文件数据列并列)
我需要把多个包含数据的.txt文件合并成一个.csv文件,要求每个.txt文件的内容单独列为一列。目前我的代码如下:
$location = (Get-Location).Path $files = Get-ChildItem $location -Filter "*.asd.txt" $data = @() foreach ($file in $files) { $fileData = Get-Content $file.FullName foreach ($line in $fileData) { $lineData = $line -split "\t" $data = $lineData[1] Add-Content -Path "$location\output.csv" -Value $data } }
每个.txt文件的格式是第一列为"Wavelength",第二列为对应数值。我希望保留"Wavelength"列,将所有文件的第二列并列展示,表头使用对应文件的完整名称(例如"stovikmladyDoupno2 2020080500001.asd")。我已经找资料折腾两天了,试过在文件末尾加逗号但没用。
以下是部分样例数据:
Wavelength stovikmladyDoupno2 2020080500000.asd 350 6.38961399706465E-02 351 6.14107911262903E-02 352 6.04866108251357E-02 353 5.83485359067184E-02 354 0.054978792413247 355 5.27014859356317E-02 356 5.34849237528764E-02 357 5.32841277775603E-02 358 5.23466655229364E-02 359 5.47595002186027E-02 360 5.22061034631109E-02 361 4.90149806042666E-02 362 4.81633530421385E-02 363 4.83974076557941E-02 364 4.65219929658367E-02 365 0.044800930294557 366 4.47830287392802E-02 367 4.46947539436297E-02 368 0.043756926558447 369 4.31725380363072E-02 370 4.36867609723618E-02 371 4.33227601805265E-02 372 4.29978664449687E-02 373 4.23860463187361E-02 374 4.12183604375401E-02 375 4.14306521081773E-02 376 4.11760903772502E-02 377 4.06421127128478E-02 378 4.09771489689262E-02 379 4.10083126746385E-02 380 4.05161601354181E-02 381 3.97904564387456E-02
解决方案
核心思路是把每个文件的数据转换成以波长为键的哈希表,合并所有哈希表后导出为CSV。代码如下:
$location = (Get-Location).Path $files = Get-ChildItem $location -Filter "*.asd.txt" # 初始化哈希表存储合并数据,键为Wavelength $mergedData = @{} foreach ($file in $files) { # 提取文件名(去掉.txt后缀)作为CSV列名 $columnName = $file.Name -replace '\.txt$', '' # 读取文件内容,过滤空行 $fileContent = Get-Content $file.FullName | Where-Object { $_ -match '\S' } foreach ($line in $fileContent) { # 用任意空白符分割行,兼容制表符/多空格分隔 $parts = $line -split '\s+', 2 | Where-Object { $_ } if ($parts.Count -ne 2) { continue } $wavelength = $parts[0].Trim() $value = $parts[1].Trim() # 跳过表头行 if ($wavelength -eq 'Wavelength') { continue } # 若波长未在哈希表中,新建条目 if (-not $mergedData.ContainsKey($wavelength)) { $mergedData[$wavelength] = [PSCustomObject]@{ Wavelength = $wavelength } } # 添加当前文件的数值列 $mergedData[$wavelength] | Add-Member -MemberType NoteProperty -Name $columnName -Value $value -Force } } # 按波长排序后导出CSV $mergedData.Values | Sort-Object { [double]$_.Wavelength } | Export-Csv -Path "$location\output.csv" -NoTypeInformation -Encoding UTF8
代码说明:
- 文件读取与列名提取:遍历目标文件,自动提取文件名作为CSV的列标题。
- 数据分割处理:用
\s+分割行内容,兼容样例中的空格分隔和标准制表符分隔,过滤无效行。 - 数据合并:通过哈希表确保每个波长只保留一条记录,逐步添加各文件的数值列。
- 导出CSV:将合并后的对象按波长排序,导出为规范的CSV文件,自动处理表头对齐。
内容的提问来源于stack exchange,提问作者GetTheLoot
相关产品推荐
相关产品推荐

