gpt4 book ai didi

ruby - 在 Ruby 中解析文本

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:03 27 4
gpt4 key购买 nike

我正在编写用于为 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

方括号中的 [parts] 一词只是一个节标题。我希望提取的信息是引用标志、形状、位置和旋转。我已经有了从重新格式化的文本文件中执行此操作的代码,使用 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

然后我使用一个数组来提取数据[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{"
}

从运行“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

我试图从未编辑的原始文件“sample_1.txt”中获得相同的结果,而无需使用记事本“sample_2.txt”从文件中删除信息的额外步骤。关键字,后接冒号(part,shape,pos),只出现在文档的这一部分,其他地方都没有,但是……文档比较长,我需要脚本忽略所有出现在前面和之后是 [parts] 部分。

最佳答案

你的问题不清楚,但是这个:

text.scan(/^\s+shape: "(.*?)"\s+pos: (\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)

会给你:

[["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"]]

问题修改后添加

这个:

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

给你

[["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"]]

改题后第二次添加

这个:

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

即使是负数也能让您捕获数字。

关于ruby - 在 Ruby 中解析文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5986825/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com