【问题标题】:CSV/Powershell Add an -HeaderCSV/Powershell 添加 -Header
【发布时间】:2021-12-12 18:21:48
【问题描述】:

我有这个循环:

foreach($line in Get-Content .\script2.csv)
{ $firstname = $line.split(';')[0] 
$lastname = $line.split(';')[1]
$email = $line.split(';')[2] 
$newLine = """$firstname"",""$lastname"",""$email"""
$newLine >> newCSV.csv }

我想添加一个特定的标题,但我不知道在我的小脚本中应该在哪里写“-header”。

谢谢

编辑:

我有一个这样的文件:

A;B;C 
A;B;C 
A;B;C 
A;B;C 

我需要这个:

"info1","info2","info3",...,"info18" 
"A","B",C","","","","","","","","","","","","","","",""
"A","B",C","","","","","","","","","","","","","","",""
"A","B",C","","","","","","","","","","","","","","",""
"A","B",C","","","","","","","","","","","","","","",""

【问题讨论】:

  • Import-Csv -Path .\script2.csv -Header 'FirstName','LastName','Email'。正如我试图在您的previous question 中解释的那样,在处理 CSV 文件时您不应该使用Get-Content。顺便提一句。 CSV 不是 Excel,而是由特定字符(通常是逗号)分隔的一组结构化数据
  • 是的,我明白了。我用 Import-Csv 尝试了一些语法,但之后我不知道如何编写我的循环。在我的情况下,我需要一个像 ("a","b","c","d"...) 这样的标题,然后是我从循环中提取的所有数据,这就是我迷路的地方......
  • 你根本不需要循环。 Import-Csv 将 csv 中的数据解析为 objects 并将这些数据写入新的 csv 文件,使用 Export-Csv。您没有阅读/尝试上一个问题中的my answer 吗?
  • 我当然读过,所以,也许你可以帮助我。我需要从第 2 行获取所有数据并将它们连接在一列中。这就是我尝试使用循环但肯定有更简单的方法的原因。我的问题是,我不知道正确的语法,自从 2 周以来我一直在网上查看,但是当你是初学者时,独自一人很难。
  • 非常感谢,它有效!这都是我的错,我认为逗号之间的每个“”都很重要,但事实并非如此。谢谢!

标签: powershell csv foreach header


【解决方案1】:

正如我所评论的,这可以简单地在没有循环的情况下完成:

您的输入 CSV (script2.csv)

A;B;C 
A;B;C 
A;B;C 
A;B;C 
# get objects from the input csv file and provide headers for the data
# then save this data with the default delimiter comma to a new file
Import-Csv -Path '.\script2.csv' -Delimiter ';'  -Header 'info1','info2','info3','info4','info5' | 
Export-Csv -Path '.\newCsv.csv' -NoTypeInformation

会给你一个新文件“newCsv.csv”,如下所示:

"info1","info2","info3","info4","info5"
"A","B","C",,
"A","B","C",,
"A","B","C",,
"A","B","C",,

如果您需要更多字段,您可以简单地创建一个字符串数组来隐藏所有想要的标题并使用它。

类似

$header = 1..18 | ForEach-Object {"info$_"}
Import-Csv -Path '.\script2.csv' -Delimiter ';' -Header $header | 
Export-Csv -Path '.\newCsv.csv' -NoTypeInformation

这将保存带有此内容的 newCsv.csv:

"info1","info2","info3","info4","info5","info6","info7","info8","info9","info10","info11","info12","info13","info14","info15","info16","info17","info18"
"A","B","C",,,,,,,,,,,,,,,
"A","B","C",,,,,,,,,,,,,,,
"A","B","C",,,,,,,,,,,,,,,
"A","B","C",,,,,,,,,,,,,,,

ANY 读取此类文件的软件应该能够处理空字段,因为绝对没有理由用 "" 填充这些字段以表示该字段为空。读取/导入 CSV无论如何,应该总是以 strings 的形式返回值,就像 Import-Csv 所做的那样。


  • Import-Csv 从分隔符分隔值文件中的项目创建类似表格的自定义对象。通常此分隔符是逗号,因此扩展名为 逗号分隔值 (.csv)
  • Export-Csv 将对象转换为一系列分隔符分隔值 (CSV) 字符串并将字符串保存到文件中。
  • Get-Content 获取文本文件的内容并返回一个字符串数组,其中的行在换行符处分割。
    将开关 -Raw 添加到此 cmdlet 时,它将文件内容作为包含换行符的单个多行字符串返回。

【讨论】:

  • 我完成了我的脚本,当我尝试将它导入我的打印机时,它不起作用......我手动尝试,最后我需要逗号之间的每个“”。你知道我该怎么做吗?
  • @MaximeL 太奇怪了...无论如何,您可以在保存 csv 文件后尝试(Get-Content -Path '.\newCsv.csv' -Raw) -replace ',,', ',"",' -replace '(?ms),$', ',""' | Set-Content -Path '.\newCsv.csv'
  • 完美,正是我需要的,再次感谢!
猜你喜欢
  • 2019-03-22
  • 2013-06-05
  • 2016-06-27
  • 2020-06-01
  • 2018-11-26
  • 1970-01-01
  • 2021-06-18
  • 2016-12-31
相关资源
最近更新 更多