2013-02-21 3 views
0

я получил применение ГИС, которая запрашивает CSV в качестве входных данных, в то время как значения для этого CSV генерируются другим приложением ГИС в формате следующих C++:Автоматически создать CSV из 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++ файл в формате 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

+0

Это не C++. Это _similar_ для C++, но не для C++. –

ответ

0

Очень быстрое и грязное решение, зависящее от фиксированного порядка строк, достаточно просто. Если учетный внутренний порядок меняется, требуется более сложный подход.

Если порядок записей изменяется, как иногда бывает TYPE до POSITION, а иногда нет, парсер должен быть повторно реализован. Конечный автомат, который отслеживает ключевые слова и некоторые регулярные выражения, должен работать в таком случае.

Идея простого решения состоит в том, чтобы прочитать файл и просмотреть все строки. Если найдется строка, содержащая 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

+0

Работает как очарование! Большое вам спасибо, vonPryz! – user2094242

Смежные вопросы