从C++文件自动创建CSV

Automatically create a CSV from a C++ file

本文关键字:创建 CSV C++ 文件      更新时间:2023-10-16

我得到了一个GIS应用程序,它要求一个CSV作为输入,而该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

有没有一种方法可以通过powerscript或类似的东西来实现?对我来说,使用notepad++及其正则表达式也是一种选择,尽管我更喜欢自动脚本。

一个依赖于固定行顺序的快速而肮脏的解决方案非常简单。如果记录的内部顺序不同,则需要更复杂的方法。

如果记录的顺序发生了变化,比如有时TYPEPOSITION之前,有时没有,则必须重新实现解析器。跟踪关键字和一些正则表达式的状态机应该在这种情况下工作。

简单解决方案的想法是读取文件并循环遍历所有行。如果找到一个包含POSITION的行,让我们选取它和下两行。删除多余的字符并创建一个格式化字符串。最后,将所有内容保存在一个文件中。这没有使用正确的CSV输出,所以如果字段包含需要转义的值,脚本就会中断。如果是这种情况,则需要更复杂的基于自定义对象和export-csv的方法。

$d = get-content  c:tempinfile.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:tempout.csv -value $rows # Write output to a file.