You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PowerShell将单行逗号分隔温度数据转为单列并保存为CSV?

问题描述

我有一个文本文件,其中包含一行以逗号分隔的温度数据,希望通过PowerShell脚本将其转换为单列并保存为CSV文件。温度数据如下:

21,22,22,22,22,22,22,20,19,18,17,16,15,14,13,12,11,10,9,9,9,8,8,9,8,8,8,9,9,8,8,8,9,9,9,8,8,8,8,8,9,10,12,14,15,17,19,20,21,21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,22,24,25,26,27,27,27,28,28,28,29,29,29,28,28,28,28,28,28,27,27,27,27,27,29,30,32,32,32,32,33,34,35,35,34,33,32,32,31,31,30,30,29,29,28,28,27,28,29,31,33,34,35,35,35,36,36,36,36,36,36,36,36,36,37,37,37,37,37,37,38,39,40,42,43,43,43,43,43,42,42,42,41,41,41,41,40,39,37,36,35,34,33,32,31,31,31,31,31,31,31,31,31,31,

我尝试了修改后的代码,但出现报错:Input string was not in a correct format。修改后的代码如下:

$txt = Get-Content 'C:myfile.txt' | Out-String
$txt -split '(?m)^,\r?\n' | ForEach-Object {
    # create empty array
    $row = @()

    $arr = $_ -split '\r?\n'
    $k = 0
    for ($n = 0; $n -lt $arr.Count; $n += 2) {
        $i = [int]$arr[$n]
        # if index from record ($i) is greater than current index ($k) append
        # required number of empty fields
        for ($j = $k; $j -lt $i-1; $j++) { $row += $null }
        $row += $arr[$n+1]
        $k = $i
    }

    $row -join '|'
}

仅处理单行数据的场景应该不难,请问有什么方法可以将这行数据转换为单列?

解决方法

你的问题核心是把单行逗号分隔的数据拆成单列,不需要复杂的转置逻辑,以下是几种简单可行的方案:

方法一:生成带表头的标准CSV

这是最规范的方式,直接读取数据并生成符合CSV格式的文件:

# 读取文件内容,按逗号拆分后过滤空项
$temperatures = (Get-Content 'C:\myfile.txt' -Raw) -split ',' | Where-Object { $_ -match '\d+' }

# 将每个温度值包装为对象,指定列名后导出为CSV
$temperatures | ForEach-Object {
    [PSCustomObject]@{
        Temperature = $_
    }
} | Export-Csv -Path 'C:\output.csv' -NoTypeInformation
  • Get-Content -Raw 一次性读取整个文件为单个字符串,避免换行干扰
  • -split ',' 按逗号拆分数据,Where-Object 过滤掉末尾逗号产生的空值
  • 用PSCustomObject包装数据,确保CSV包含明确的列名,Export-Csv生成标准CSV文件

方法二:快速生成无表头的单列文件

如果不需要CSV表头,或者只想生成纯文本单列文件,可以用更简洁的命令:

# 生成纯文本单列文件
(Get-Content 'C:\myfile.txt' -Raw) -split ',' | Where-Object { $_ -match '\d+' } | Out-File 'C:\output.txt'

# 生成无表头的CSV文件
(Get-Content 'C:\myfile.txt' -Raw) -split ',' | Where-Object { $_ -match '\d+' } | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Out-File 'C:\output.csv'

原代码报错原因

你之前的代码是针对带索引的行转列数据编写的,完全不适用于当前场景:

  • 代码尝试将$arr[$n]转为整数,但你的数据全是温度值,没有索引字段,强制转int自然会报错
  • 原逻辑是处理成对的索引-值数据,和当前简单的逗号拆分需求不匹配

内容的提问来源于stack exchange,提问作者weatherdoc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:35:32