2017-08-21 20 views
1

いくつかのヘッダーの名前と列の数が経時的に変更された一連のファイルがあります。ただし、ファイルの開始日は常に最初の列、終了日は2番目の列です。Import-CSV行の最初の2つの項目を取得します

私はこれらの2つの列だけを取得したいと思いますが、名前は時間の経過と共に変更されています。

$FileContents=Import-CSV -Path "$InputFilePath" 
foreach ($line in $FileContents) 
{ 
    $StartDate=$line[0] 
    $EndDate=$line[1] 
} 

...しかし$たFileContentsは(私は信じている)タイプの配列(オブジェクト?)私はPowerShellでのアクセスを位置的するかどうかはわかりませんです: は私がしようとしたことはこれです。どんな助けもありがとう。

編集:ファイルはカンマ区切り記号からパイプ区切り記号に変換されていますが、作業するファイルが1000個あるため、どちらの形式も暗黙的に読み取ることができるため、Import-CSVを使用します。

これはどのように

答えて

1

:あなたは、CSVの列にしたいヘッダ名を最初に与えること-Headerパラメータを使用することができ

$FileContents=get-content -Path "$InputFilePath" 

for ($i=0;$i -lt $FileContents.count;$i++){ 
    $textrow = ($FileContents[$i]).split(",") 
    $StartDate=$textrow[0] 
    $EndDate=$textrow[1] 

    #do what you want with the variables 
    write-host $startdate 
    write-host $EndDate 
} 

CSVファイルを参照している保留中....

+1

このアプローチの前提は、区切り文字がデータ内にあることです。そうでない場合は、分割および余分な引用符で問題が発生します。 '$ i = 0' - >' $ i = 1'のように、最初の行をスキップする必要があります。そうしないと、古いヘッダがデータのオブジェクトになります。 – BenH

+0

これは機能しました。私は、 "StartDateColumn"、 "EndDateColumn"を "foreach($ FileContentsの$行)"というヘッダーとして使用しました。 $ line.StartDateColumnを使うと必要な結果が得られました。ありがとうございました。 – Phoenix14830

3

。その後、古いヘッダーを持つ最初の行をスキップします。

$FileContents = Import-CSV -Path "$InputFilePath" -Header "StartDate","EndDate" | Select-Object "StartDate","EndDate" -Skip 1 

foreach ($line in $FileContents) { 
    $StartDate = $line.StartDate 
    $EndDate = $line.EndDate 
} 

ここでは例です:

Example.csv 

a,b,c 
1,2,3 
4,5,6 

Import-CSV -Path Example.csv -Header "StartDate","EndDate" | Select-Object "StartDate","EndDate" -Skip 1 

StartDate EndDate 
--------- ------- 
1   2 
4   5 
+0

あなたの答えは私のほうが好きなので、私はそれを上書きしました。 'Header'パラメータは' Convertfrom-Csv'でも利用可能です。 *はじめて* – vrdse

+0

GJ、しかし必須ではない 'Select-Object "StartDate"、 "EndDate" -Skip 1'、 'Select -skip 1'は十分なので – Esperento57

3

あなたがImport-Csvを使用する場合は、PowerShellは確かにあなたのためのオブジェクトを作成します。 「列」はのプロパティです。プロパティはSelect-Objectで選択できます。プロパティに名前を付けて、選択しなければなりません。あなたは事前にプロパティ名を知らないので、Get-Memberで名前を得ることができます。最初の2つのプロパティは、CSVの最初の2つの列と一致する必要があります。

次のサンプルコードを使用して、スクリプトに適用します:foreachの(foreachのの%=別名)とスプリット付き

$csv = @' 
1,2,3,4,5 
a,b,c,d,e 
g,h,i,j,k 
'@ 

$csv = $csv | ConvertFrom-Csv 
$properties = $csv | Get-Member -MemberType NoteProperty | Select-Object -First 2 -ExpandProperty Name 
$csv | Select-Object -Property $properties 
+0

ループ内の値を取得する方法を示す必要があります。例えば'foreach($ csv内の$行){$ startdate = $行。($プロパティ[0])}' – BenH

0

その他のソリューション:

Get-Content "example.csv" | select -skip 1 | %{$row=$_ -split ',', 3; [pscustomobject]@{NewCol1=$row[0];NewCol2=$row[1]}} 
0

あなたに述語を構築することができますこのように、あまりにも選択:

Get-Content "example.csv" | select @{N="Newcol1";E={($_ -split ',', 3)[0]}}, @{N="Newcol2";E={($_ -split ',', 3)[1]}} -skip 1 
関連する問題