0

入力として CSV を要求する GIS アプリケーションを取得しましたが、その CSV の値は別の GIS アプリケーションによって次の C++ 形式で生成されます。

class _shape_0
{
objectType="waterbody";
class Arguments
{
    POSITION="[946.58899, 1087.7439, 0]";
    TYPE="01_SaltLake";
    ORIENTATION="45";
};
 };
class _shape_1
{
objectType="vegetation";
class Arguments
{
    POSITION="[962.88275, 1087.9946, 0]";
    TYPE="02_PineWoods";
    ORIENTATION="270";
};
  };
    class _shape_2
 {
objectType="vegetation";
class Arguments
{
    POSITION="[941.5755, 1068.6926, 0]";
    TYPE="03_Wheatcrop";
    ORIENTATION="135";
};

    and so on...

出力ファイルには何百もの項目が含まれているため、その出力 c++ ファイルのPOSITION、TYPE、および ORIENTATIONを次のように CSV に変換する自動化されたスクリプトを使用したいと考えています。

TYPE, POSITION [X, Y, Z], ORIENTATION
03_Wheatcrop, 941.5755, 1068.6926, 0, 135
02_PineWoods, 962.88275, 1087.9946, 0, 270
01_SaltLake, 946.58899, 1087.7439, 0, 45

パワースクリプトなどでそれを行う方法はありますか? 自動化されたスクリプトの方が好きですが、notepad++ とその正規表現を使用することも選択肢の 1 つです。

4

1 に答える 1

0

固定行の順序に依存する非常に迅速で汚い解決策は、十分に簡単です。レコードの内部順序が異なる場合は、より複雑なアプローチが必要です。

レコードの順序が変更された場合TYPEは、以前POSITIONの場合とそうでない場合のように、パーサーを再実装する必要があります。このような場合、キーワードといくつかの正規表現を追跡するステートマシンが機能するはずです。

簡単な解決策のアイデアは、ファイルを読み取り、すべての行をループすることです。を含む行POSITIONが見つかった場合は、それと次の2つの行を選択しましょう。余分な文字を削除し、フォーマットされた文字列を作成します。最後に、すべてのものをファイルに保存します。これは適切なCSV出力を使用しないため、フィールドにエスケープが必要な値が含まれている場合、スクリプトは中断します。その場合は、カスタムオブジェクトに基づくより複雑なアプローチexport-csvが必要です。

$d = get-content  c:\temp\infile.dat # Read the incoming C++ish file
$rows = @() # Empty array for results
$rows += "TYPE, POSITION [X, Y, Z], ORIENTATION" #Header row
for ($i=0; $i -le $d.count -2; ++$i) { # Loop through the data
  if( $d[$i] -match "POSITION" ) { # POSITION element, let's pick it and two next lines
     $pos = $d[$i].Replace('POSITION="[', '').Replace(']";', '').Replace(' ', '') # Remove extra chars
     $typ = $d[$i+1].Replace('TYPE="', '').Replace('";', '').Replace(' ', '')
     $ori = $d[$i+2].Replace('ORIENTATION="', '').Replace('";', '').Replace(' ', '')
     $rows += $("{0}, {1}, {2}" -f $typ, $pos, $ori ) # Add formatted string to array
  } 
}

set-content -path c:\temp\out.csv -value $rows # Write output to a file.
于 2013-02-21T07:27:28.713 に答える