2013-02-21 123 views
0

我有一個GIS應用程序,它要求一個CSV作爲輸入,而由下面的C++格式的另一個GIS應用生成該CSV值:自動從C創建CSV ++文件

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轉換位置,類型和方向 ++文件轉換爲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 

有沒有一種辦法由powerscr做ipt或類似的東西?使用notepad ++及其正則表達式對我來說也是一種選擇,儘管我更喜歡自動腳本。

+0

我很好奇,爲什麼你不在C++串化器中正確格式化它? – Najzero 2013-02-21 06:47:01

+0

這不是C++。它與C++類似,但不是C++。 – 2013-02-21 06:49:46

回答

0

取決於固定行順序的一個非常快速和骯髒的解決方案很容易。如果記錄的內部訂單有所不同,則需要更復雜的方法。

如果記錄的順序發生變化,有時TYPEPOSITION之前,有時不是,解析器必須重新實現。跟蹤關鍵字和一些正則表達式的狀態機應該在這種情況下工作。

簡單解決方案的想法是讀取文件並遍歷所有行。如果找到包含POSITION的行,讓我們選擇它和下兩行。刪除額外的字符並創建一個格式化的字符串。最後,將所有內容保存在文件中。這不使用正確的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. 
+0

感謝您的快速回復!順序始終保持不變,所以我希望它能起作用。將測試什麼時候回來工作... – user2094242 2013-02-21 08:59:44

+0

工程就像一個魅力!非常感謝vonPryz! – user2094242 2013-02-21 15:57:26