【问题标题】:Rexx - Parse a CSV line (';' separator)Rexx - 解析 CSV 行(';' 分隔符)
【发布时间】:2013-03-04 11:13:47
【问题描述】:

我知道我们可以用类似的东西解析 CSV 行(';' 分隔符):

delim = ';'
myline="i;want;to;know;what;love;is"
parse var myline w1 (delim) w2 (delim) w3 (delim) w4 (delim) w5 (delim) w6 (delim) w7
say w1 w2 w3 w4 w5 w6 w7

我想知道是否有一种方法可以简化“w# (delim)”的迭代,以便执行以下操作:

parse var myline w1 (delim) w2 (delim) ... (delim) w6 (delim) w7
/* then we will have all w1 to w7 defined

我可以用一些数组做一个函数来做到这一点,但它是否可以在 rexx 上本地实现,我只是想知道

谢谢

【问题讨论】:

    标签: parsing csv rexx


    【解决方案1】:

    当然,如果您真正想要的是名为w1w2、...wnn 变量:

    do i = 1 by 1 while myline <> ''
        parse var myline word (delim) myline
        interpret "w" || i "= word"
    end
    

    但是 Rexx-y 的方法是使用“stem array”:

    delim = ';'
    do i = 1 by 1 while myline <> ''
        parse var myline w.i (delim) myline
    end
    w.0 = i-1
    

    甚至:

    do i = 1 by 1 while myline <> ''
        parse var myline w.i ';' myline
    end
    w.0 = i-1
    

    当你完成后,你有一个数组w.,它的计数在w.0n 单词在w.1w.2,...直到w.n。这更好,因为 Rexx 对. 之后的部分进行了特殊处理:您可以使用任何变量,并且将使用它的值来代替。所以打印所有这些词就是:

    do i = 1 to w.0
        say w.i
    end
    

    或者重新组装它们只是:

    line = ""
    do i = 1 to w.0
        line = line || w.i || ';'
    end
    

    【讨论】:

    • 我不知道 Parse 正在分配剩余的单词。谢谢,你帮了我很多。
    • 我认为你需要一个 DO 循环的终止条件。尝试在MYLINE 的末尾添加一个分隔符,然后在DO I = 1 BY 1 UNTIL STRIP(MYLINE) = '' 后面添加一个分隔符
    • @NealB 是的,这将教我在不运行代码的情况下输入代码。更新为 while myline &lt;&gt; '',就可以了。
    • do i = 1 by 1 while myline &lt;&gt; '' 是完美的循环 (@NealB)。在我的 Rexx 中分配 w.0 = i 是错误的:i 在直到测试之前递增:所以它将是 w.0 = i - 1
    • @Martin 是的,我输入了那个代码,但我没有运行它。现已修复。
    猜你喜欢
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多