2017-10-04 8 views
0

私たちはプロジェクトの一環として、安全なSFTPの場所からemlファイルの巨大な塊をダウンロードしています。ダウンロードした後、ダウンロードした各ファイルにサブタグを追加する必要があります。約90 MB、私は他のサイトで見てきたpowershellスクリプトを使ってサブタグを追加しようとしたが、下に貼り付けても、10 KBから200 KBの小さなファイルでうまく動作するが、誰かがそれを通過するのを助けてくれる?パワーシェル大きなファイルの中にテキストを挿入する(90MB)

(Get-Content F:\EmlProcessor\UnZipped\example.eml) | 
    Foreach-Object { 
     $_ # send the current line to output 
     if ($_ -match "x-globalrelay-MsgType: ICECHAT") 
     { 
      #Add Lines after the selected pattern 
      " X-Autonomy SubTag=GMAIL" 
     } 
    } | Set-Content F:\EmlProcessor\EmlProcessor\example2.txt 

SAMPLEのEMLファイル

Date: Tue, 3 Oct 2017 07:44:32 +0000 (UTC) 
From: XYZ 
To: ABC 
Message-ID: <[email protected]> 
Subject: Symphony: 2 users, 4 messages, duration 00:00 
MIME-Version: 1.0 
Content-Type: multipart/mixed; 
    boundary="----=_Part_28220_1999480254.1507075364517" 

x-globalrelay-MsgType: GMAIL 
x-symphony-StreamType: GMAIL 
x-symphony-StreamID: RqN3HnR/ajgZvWOstxzLuH///qKcERyOdA== 
x-symphony-ContentStartDateUTC: 1507016636610 
x-symphony-ContentStopDateUTC: 1507016672387 
x-symphony-FileGeneratedDateUTC: 1507075364516 

------=_Part_28220_1999480254.1507075364517 
Content-Type: text/html; charset=UTF-8 
Content-Transfer-Encoding: quoted-printable 

<!DOCTYPE html><html><body><p><font color=3D"grey">Message ID: Un/pfFrGvvVy= 
T6quhMBKjX///qEezwdFdA=3D=3D</font><br>2017-10-03T07:43:56.610Z 0 

---- 
------ 
----- 
</HTML> 

上記サンプル入力ファイルに示されるように、私は、テキスト "X-globalrelay-のMsgType" 上記または下記の "X-自律サブタブ" を追加する必要があります。

サンプルファイルにサブタグを追加しようとしましたが、それは打たれたと言われていますが、私の要件は各ファイルをループすることでほぼ2Kファイルに追加することですが、上記のファイルコードは失敗しましたが、私はバッチに非常に新しいです& Windowsのpowershellスクリプトは、任意の迅速なヘルプは高く評価されます。

+0

これらのリンクを見てみましょう:http://rkeithhill.wordpress.com/2007/06/17/optimizing-performance-of-get-content-for-large-files/そしてRomanの答えはこちらをご覧ください:https: //stackoverflow.com/questions/4192072/how-to-process-a-file-in-powershell-line-by-line-as-a-stream – Squashman

答えて

0

あなたは固まっていると思うのですか、それとも時間がかかりますか?あなたのコードは、一致を見つけるために何千もの行を繰り返し処理しなければなりません。

私は大きなテキストファイルを持っていなかったので、大きなcsv(60 MB)をtxtに変換しました。これはかなり速く(10-15秒)働いていました。

注:新しいもので、PowerShellのパワーを実感しているので、私は本当に寛大なことになるでしょう。ほとんどの人はあなた自身が何らかの努力を払うことを期待しますが、スクリプトが何をしているのかを少なくとも理解しようとします。あなたがここにあなたの環境で直接テストをせずに取得したスクリプトを使用すると、深刻な被害が出る可能性があります。だから、少なくともテストのために、あなたは各行が何をしているのか理解するでしょう。スケーラビリティのために関数を使用するようにコードを編集しました。私はプロセスをスピードアップするためにマルチスレッドを使用することができますが、これは重いCPU指向の操作なので、私はそれがずっと良いとは思いません。

#Coz functions are the best 
Function Insert-SubTag ($Path) 
{ 
    $FileName = $Path | Split-Path -Leaf 
    $File = Get-Content -Path $Path 
    $Line = $File | Select-String -Pattern "x-globalrelay-MsgType" 
    $LineNumber = $Line.LineNumber 

    #Since Linenumber starts from 1 but array count starts from 0 
    $File[$LineNumber - 1] = "$Line 
X-Autonomy SubTag=GMAIL" 

    $SavePath = "F:\EmlProcessor\UnZipped2\$FileName" #You can also pass the save folder as a parameter to this function like $path 
    $File | Set-Content -Path $SavePath 
} 

#If you have the list of Files in a text file use this 
$FileList = Get-content C:\FileList.txt 

#If you have a folder, and want to iterate through each file, use this 
$FileList = (Get-ChildItem -Path "F:\EmlProcessor\UnZipped").FullName 

Foreach ($FilePath in $FileList) 
{ 
    Insert-SubTag -Path $FilePath 
} 

x-globalrelay-MsgTypeがテキストファイルに1回だけ表示されるとします。

これはあなたの答えがあれば選択することを忘れないでください。

+0

ありがとうRobinスクリプトは正常に動作していますが、約1分かかりました80 MB file thats ok、しかし、複数のファイルをループして、上記のコードでサブタグを追加して同じファイル名で保存するにはどうすればよいですか?すべて質問するのは申し訳ありませんが、 – rajendra

+0

まず、 '$ FileList = Get-Childitem -File'を実行するなどして、ファイルのリストを作成する必要があります。次に、そのリストをループすることができます: 'Foreach($ FileList内の$ Item){$ File = Get-Content -Path $ Item.Fullname ...}'。 – whatever

+0

しかし、別のフォルダの場所にサブタグテキストが追加されたら、同じ名前のファイルを保存するには – rajendra

関連する問題