使用powershell读取文本文件,在将每个文本文件输出到CSV之前编辑列

6bc51xsx  于 2023-04-09  发布在  Shell
关注(0)|答案(2)|浏览(174)

我有一批文本文件需要转换为csv文件。然而,一旦我打开csv文件,一列中的数据已经转换为科学计数法。我想通过编辑列并在输出到最终csv之前插入撇号来防止这种情况。我在网上找到的大多数建议都涉及首先定义所有列/标题。这种解决方案并不理想,因为不同的文本文件有不同的标题。但是,所有的文件都有一个名为“acct”的列。这是我唯一想编辑的列。
我的脚本用于获取文本并输出到csv:

$path = "C:\Test\*.txt"
$files = Get-ChildItem $path | where { ! $_.PSIsContainer }
foreach ($file in $files){
    $newFileName = ($file.Fullname) -Replace ".txt",".csv"
    Import-Csv $file.FullName |Export-Csv $newFileName -NoTypeInformation 
}

到目前为止,我已经能够像这样编辑列

$acct = (Import-Csv $file).acct
    $acct ="'"+ $acct

我正在努力将这些文件组合起来,以便我的输出,$newfilename,将编辑后的值存储在“acct”列中。欢迎任何建议,如果有另一种方法可以转换这些文件并防止数据变成科学记数法,我会全力支持。
当我尝试合并代码时,例如通过管道将$acct传输到export-csv,通常最终得到的输出是一个只有以下内容的csv文件:“Length”“34”EDIT:我正在更新我正在处理的数据样本。原始文件包含167列,我不认为我可以以一种清晰的方式发布在这里。
data_id,place,placepool_id,acct,sec_acct,ter_acct,source_acct,product_id 123A0001234567,00,12345,1234567890123456,9876543210123456,,,123,
123A0001234567,00,12345,1.23457E +15,9.87654E +15,,,123,
我想编辑数据,以防止任何信息被转换为科学计数法。

wljmcqd8

wljmcqd81#

所以你有一个正确的想法,使用名称编辑列。我们只需要按行编辑每个值。谢天谢地,我们还可以得到column names,所以它应该工作,而不必手动输入所有列。我使用@Theo的建议,预先附加“`t”到单元格值,这解决了Excel以科学记数法显示值的问题。
希望这是一个很好的起点。在目前的状态下,它可能不是最有效的。

$path = "C:\Test\*.txt"
$files = Get-ChildItem $path | where { ! $_.PSIsContainer }
foreach ($file in $files){
    $newFileName = ($file.Fullname) -Replace ".txt",".csv"
    $csv = Import-Csv $file.FullName

    # get column names
    $columnNames = ($csv[0].psobject.Properties | select Name).Name

    # will have to work by row
    $rowNum = [int]0
    while ($rowNum -lt $csv.count){
        
        # on the row change value for each column
        foreach ($column in $columnNames) {
    
            
            $csv[$rowNum].$column = "`t" +  $csv[$rowNum].$column
        }
        
        $rowNum += 1
    }

    
    # was running into a bug with powershell on a mac so had to pipe $csv to export-csv instead of using -input-object
    $csv | Export-Csv -LiteralPath $newFileName -NoTypeInformation
    
}
m2xkgtsf

m2xkgtsf2#

继续我的评论:

  • 要阻止Excel在打印数据时转换数值,您可以在其值前添加一个TAB字符。Excel将以文本形式读取该值
  • 当使用Export-Csv保存更新的数据时,您可以附加开关-UseCulture,以便使用的delinmiter字符是从设置为本地ListSeparator字符的任何字符中选择的。Excel希望通过双击打开文件时,这样您就不必使用导入向导。(要查看系统中设置的字符,请使用(Get-Culture).TextInfo.ListSeparator
$path = 'C:\Test'
$files = Get-ChildItem $path -File -Filter '*.txt'
foreach ($file in $files) {
    $data = Import-Csv -Path $file.FullName
    foreach ($row in $data) {
        # prepend a TAB character in front of the field you want Excel to 
        # treat as string as opposed to converting it to scientific value
        $row.acct = "`t{0}" -f $row.acct
        # you can do the same here for fields 'data_id', 'sec_acct' etc if needed
    }
    $newFile = [System.IO.Path]::ChangeExtension($file.Fullname,".csv")
    # now save the updated data. With -UseCulture you can simply
    # double-click the created csv file to open in Excel on any machine
    # that has the same locale setting for the ListSeparator
    $data | Export-Csv -Path $newFile -NoTypeInformation -UseCulture
}

相关问题