【问题标题】:Call Powershell Import-Csv cmdlet with variable -Header使用变量 -Header 调用 Powershell Import-Csv cmdlet
【发布时间】:2016-06-27 08:48:23
【问题描述】:

字段的总数和位置因文件而异,但我感兴趣的字段始终存在。 File1.csv 如下所示:

1,1.0,一个
2,2.0,两个

见下面的代码:

function Read_Headers_From_File($filename)
{
    # Yes, I am not reading a file right now
    "int,float,string"
}

$header1 = Read_Headers_From_File("file1.ini")
$file1 = Import-Csv -Header $header1 file1.csv
# $header2 = Read_Headers_From_File("file2.ini")
# $file2 = Import-Csv -Header $header2 file2.csv
echo $file1

输出是:

整数,浮点数,字符串
----------------
1
2

“int,float,string”被解释为名为“int,float,string”的单个字段。有没有办法让 -Header "field1,field2,field3" 像 -Header field1,field2,field3 一样工作?

【问题讨论】:

  • 建议您编辑此问题以更好地解释问题和所需结果。

标签: csv powershell


【解决方案1】:

您可以这样做以排除列,例如 y:

$userdata = Import-Csv test.csv | select-object * -exclude y

尽管您没有要求您可以这样做来重命名列:

# Assume you want to use the header names x,y,z instead of what 
# is specified in the header line of the file
# The Header parameter allows you to specify headers for a CSV that (nominally)
# doesn't contain a header line. But if the CSV file does contain a header line
# and -Header is specified then the header line is treated like a data line.
# The select -skip 1 discards the header-line-as-data row

$userdata = Import-Csv -Header x,y,z test.csv | select-object -skip 1

【讨论】:

  • 很高兴知道,但我的问题是列的名称是固定的,但位置是可变的,所以我想动态创建标题以匹配从文件中读取的已知位置。我想我可以将文件复制到包含动态创建的标头的新文件中,然后调用 Import-Csv。
  • 您可以重命名列。如果列标记为 x、y、z,但实际上是 z、x、y,则将列重命名为 z、x、y,如答案的第二部分所述。
  • 记住我的源 CSV 文件没有要重命名的标题。似乎我无法使用 -Headers 即时添加标题,因此解决方案是使用我想要的标题创建一个新文件 dest.csv 并用 source.csv 的内容填充它。
  • OP 没有说你的 CSV 没有标题,所以我不记得了。 -Header(没有“s”)正是用于动态指定标题。请编辑 OP 以使您的问题和期望的结果更清楚。
【解决方案2】:

我彻底编辑了这个问题。我想要的可以通过这个来实现:

$header1 = Read_Headers_From_File("file1.ini")
$file1 = Invoke-Expression ("Import-Csv " + "-Header " + $header1 + " file1.csv")

这也有效:

# The ini file has a single row
# field1,field2,field3,...
function Read_Headers_From_File($ini_file)
{   
    $temp = Get-Content $ini_file
    # return array of args for -Header 
    $temp.Split(",")
}

$header1 = Read_Headers_From_File("file1.ini")
$file1 = Import-Csv file1.csv -Header $header1
echo $file1

抱歉打扰了。如果可能,请删除问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 2013-06-08
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2010-12-15
    相关资源
    最近更新 更多