在Ruby中解析文本

tah*_*wos 2 ruby text sketchup

我正在编写一个脚本,用于导入SketchUp的组件信息.在他们的帮助页面上,一个非常有用的人帮助我创建了一个按行文本文件"编辑"的工作.现在我已经准备好将它提升到一个新的水平 - 直接从FreePCB创建的原始文件导入.

我想要使​​用的文件部分如下:"sample_1.txt"

[parts]

part: C1
  ref_text: 1270000 127000 0 -7620000 1270000 1
  package: "CAP-AX-10X18-7X"
  value: "4.7pF" 1270000 127000 0 1270000 1270000 1
  shape: "CAP-AX-10X18-7"
  pos: 10160000 10160000 0 0 0

part: IC1
  ref_text: 1270000 177800 270 2540000 2286000 1
  package: "DIP-8-3X"
  value: "JRC 4558" 1270000 177800 270 10668000 508000 0
  shape: "DIP-8-3"
  pos: 2540000 27940000 0 90 0

part: R1
  ref_text: 1270000 127000 0 3380000 -600000 1
  package: "RES-CF-1/4W-4X"
  value: "470" 1270000 127000 0 2180000 -2900000 0
  shape: "RES-CF-1/4W-4"
  pos: 15240000 20320000 0 270 0
Run Code Online (Sandbox Code Playgroud)

括号中的[部分]一词只是一个部分标题.我想要提取的信息是参考指示符,形状,位置和旋转.我已经有了使用重新格式化的文本文件执行此操作的代码IO.readlines(file).each{ |line| data = line.split(" ");.

我当前的方法使用重新格式化的文本文件:"sample_2.txt"

C1 CAP-AX-10X18-7 10160000 10160000 0 0 0
IC1 DIP-8-3 2540000 27940000 0 90 0
R1 RES-CF-1/4W-4 15240000 20320000 0 270 0
Run Code Online (Sandbox Code Playgroud)

然后我使用数组来提取数据[0],数据[1],数据[2],数据[3]和数据[5].另外还有一个步骤,就是将".skp"附加到包名的末尾,以允许脚本插入与包名称相同的组件.

我想从第一个例子中提取信息,而不必像第二个例子那样重新格式化文件.即我知道如何从单个字符串中提取信息,用空格分割 - 当一个数组的文本出现在多行时,我该怎么做?

在此先感谢任何帮助;-)

编辑:下面是解析"sample_2.txt"的完整代码,该代码在运行脚本之前已重新格式化.

    # import.rb - extracts component info from text file

    # Launch file browser
    file=UI.openpanel "Open Text File", "c:\\", "*.txt"

    # Do for each line, what appears in braces {}
    IO.readlines(file).each{ |line| data = line.split(" ");

    # Append second element in array "data[1]", with SketchUp file extension
    data[1] += ".skp"

    # Search for component with same name as data[1], and insert in component browser
    component_path = Sketchup.find_support_file data[1] ,"Components"
    component_def = Sketchup.active_model.definitions.load component_path

    # Create transformation from "origin" to point "location", convert data[] to float
    location = [data[2].to_f, data[3].to_f, 0]
    translation = Geom::Transformation.new location

    # Convert rotation "data[5]" to radians, and into float
    angle = data[5].to_f*Math::PI/180.to_f
    rotation = Geom::Transformation.rotation [0,0,0], [0,0,1], angle

    # Insert an instance of component in model, and apply transformation
    instance = Sketchup.active_model.entities.add_instance component_def, translation*rotation

    # Rename component 
    instance.name=data[0]

    # Ending brace for "IO.readlines(file).each{"
    }
Run Code Online (Sandbox Code Playgroud)

结果如下,从运行"import.rb"到打开"sample_2.txt".

    C1 CAP-AX-10X18-7 10160000 10160000 0<br>IC1 DIP-8-3 2540000 27940000 90<br>R1 RES-CF-1/4W-4 15240000 20320000 270
Run Code Online (Sandbox Code Playgroud)

我试图从未经编辑的原始文件"sample_1.txt"获得相同的结果,而没有使用记事本"sample_2.txt"从文件中删除信息的额外步骤.关键字,后跟冒号(部分,形状,位置),只出现在文档的这一部分,而不是其他地方,但......文档相当冗长,我需要脚本忽略之前出现的所有内容之后,[部分]部分.

saw*_*awa 6

你的问题不明确,但是这个:

text.scan(/^\s+shape: "(.*?)"\s+pos: (\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)
Run Code Online (Sandbox Code Playgroud)

会给你:

[["CAP-AX-10X18-7", "10160000", "10160000", "0", "0", "0"],
 ["DIP-8-3", "2540000", "27940000", "0", "90", "0"],
 ["RES-CF-1/4W-4", "15240000", "20320000", "0", "270", "0"]]
Run Code Online (Sandbox Code Playgroud)

在问题发生变化后添加

这个:

text.scan(/^\s*part:\s*(.*?)$.*?\s+shape:\s*"(.*?)"\s+pos:\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/m)
Run Code Online (Sandbox Code Playgroud)

会给你

[["C1", "CAP-AX-10X18-7", "10160000", "10160000", "0", "0", "0"],
 ["IC1", "DIP-8-3", "2540000", "27940000", "0", "90", "0"],
 ["R1", "RES-CF-1/4W-4", "15240000", "20320000", "0", "270", "0"]]
Run Code Online (Sandbox Code Playgroud)

第二次在问题发生变化后添加

这个:

text.scan(/^\s*part:\s*(.*?)$.*?\s+shape:\s*"(.*?)"\s+pos:\s*(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)/m)
Run Code Online (Sandbox Code Playgroud)

即使它们是负数,也会让你捕获数字.