2013-02-21 125 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