2016-09-05 3 views
0

FTPサーバーから多数のCSVファイルを取得し、ネットワーク上の場所にダウンロードするスクリプトを作成しました。CSV - DataSplitsの使用

このCSVファイルの内容は、私が必要と私は、このファイルを使用して短い作業では、このリンク File Example

で提供している例を次に示します。

  • 12文字の使用を(英数字)は、2行目のOrds:に続いて、後でクエリで使用される変数を定義します。 (A)

    GB0000000001

    は私がおよそ

    .TrimStart([Characters_to_remove]) 
    

    を読んでいますが、最初の行をスキップするだろうかわからないですし、その後、どのように私いる

    $OrderVariable = "GB0000000001" 
    

    なります次の12文字に続くすべてを削除します。

  • Ords:を除く2つの情報を使用して、これを変数として定義します。

    GB0000000001 - プロモーションイベント

    $TitleEvent = "GB0000000001 – Promotion Event" 
    

CSV電子メールが、例えばに送信する必要があることをすべての顧客が含まれてなります

D|30|BBA 
D|300321312|DDS 
D|A|BBA 
D|A0999950|ZZG

私は、私はそれの前にすべてのものを除外するためにどのような方法を見つけることができません除いて十分に簡単だろうと思ったハッシュテーブルに書き込むことが期待されるこれらの項目。

$mytable = Import-Csv -Path $filePath -Header D,Client,Suffix 
$HashTable = @{} 
foreach ($r in $mytable) { 
    $HashTable[$r.Client] = $r.Data 
} 

UPDATE

私は、次の

$target = "\\Messaging" 

cd $target 
$Clients = Import-Csv example.txt | where {$_ -like "*D|*"} 

$Clients = $Clients[1..($Clients.count - 1)] 
$Clients | Export-Csv "Test.csv" -NoTypeInformation 

で変数に、この要素のほとんどを得るために管理しているしかし、私はそれがカスタムヘッダーまたは最初にせずにインポートすることができません"H |"更新1

の区切り...

終わり、私はこれは私が後でクエリで定義して使用する必要があります唯一の要素がクライアントであるとして要求されるために何が起こっているかおおよそであると信じて自分自身。

  • 次はこれが推進イベントで、アクションは、あなたがとるべき必要のあるメッセージの内容

    として残っているすべてのテキストを定義します。あなたの命令の

    締め切りは9月12日2016年

    このイベントの期限が延長されているの午後です。

    あなたの指示を私たちに通知するには、安全なメッセージを送信することができます。

    これは、大規模なので、単純にコンテンツが常にOrds:(ライン2)に従うとD|区切りの開始時に終了しますラインのX番号を除去することはできません都度異なる場合があります。

私は(有名な最後の言葉)と「かなり自信を持って」と私は必要なファイルを引っ張って完全に動作するスクリプトを持って、私は一緒に配置する必要があり、他のコードのほとんどは、私が働い時だけで素晴らしいではありませんよ.csvと私はそれらを持っているとき。

+0

csvは外部データプロバイダによって生成され、最初の行が区切られ、クライアントアカウント番号が区切られた形式で他のすべての要素が区切られていない部分的なCSV形式です。 –

+0

ファイルをパイプで区切って分割することはできますが、私はそれを正しくまたは間違って割り引いていました。区切られたオブジェクトとしてインポートされると、すべての "メッセージ"情報はヘッダ "H"を持つ最初のカラムに入ります。この例では、2番目の行を削除し、最後のx行はファイル内のクライアント数をD、D、Dとし、最後はTで終わります。ファイルヘッダはselfで、2番目の行に含まれていますデータのこれを非常にうまく説明していないのであれば、私の謝罪ですが、それが私が例にリンクした理由です。 –

答えて

1

グローバルなテーブル/グリッド構造を持たないデータフォーマットは柔軟です。したがって、正規表現(breakdown)を使用してみましょう。これは、そのようなテキストを解析する非常に普遍的な方法です。

$text = [IO.File]::ReadAllText('inputfile.txt', [Text.Encoding]::UTF8) 

$data = ([regex]('ORDS: (?<order>.+?) [-–—] (?<title>.+)[\r\n]+' + 
       '(?<info>[\s\S]+?)[\r\n]+' + 
       '(?<clients>D\|[\s\S]+?)[\r\n]+' + 
       'T\|(?<T>\d+)') 
    ).Matches($text) | 
    forEach { 
     $g = $_.groups 
     @{ 
      order = $g['order'].value 
      info = $g['info'].value -join ' ' 
      clients = $g['clients'].value -split '[\r\n]+' | 
       where { $_ -match 'D\|(.+?)\|(.+)' } | 
       forEach { 
        @{ 
         id = $matches[1] 
         suffix = $matches[2] 
        } 
       } 
      T = $g['T'] 
     } 
    } 

$data(ファイルは複数のエントリを有する場合、またはレコードの配列)がレコードである:

Name       Value 
----       ----- 
T        000004 
info       This is a Promotion Event and action needs to be take... 
order       GB0000000001 
clients      {System.Collections.Hashtable, System.Collections.Has... 

$data.clientsは、レコードの配列である:

Name       Value 
----       ----- 
id        30
suffix       BBA 
id        300321312 
suffix       DDS 
id        A
suffix       BBA 
id        A0999950 
suffix       ZZG 
+0

助けてくれてありがとう、私はちょっと違ったやり方で解決策を見てきましたが、それはよりエレガントではないかもしれませんが、将来的にはより大きな柔軟性を提供します。私はちょうど最後の要素を反復しており、それに応じて公開します。ヘルプが最も高く評価されました! –

関連する問題