【问题标题】:How to read/write CSV file with Lauterbach CMM script row by row如何使用 Lauterbach CMM 脚本逐行读取/写入 CSV 文件
【发布时间】:2019-10-31 11:11:36
【问题描述】:

我正在尝试使用 Lauterbach CMM 脚本逐行读取/写入 CSV 文件,但它不起作用。

我认为如果我将 csv 作为普通文件读取,我可以将 CSV 文件的每一行作为每一行读取,但事实并非如此,如果您在单元格数据中使用 LF 字符:逐行读取 CSV 文件将被终止。我的意思是脚本部分读取该行。

能否告诉我逐行读取 CSV 文件?

我的逐行读取 CSV 的代码:

OPEN #1 &csv_name /Read
WHILE !FILE.EOF(1)
(
    READ #1 %LINE &csv_row
    PRINT "&csv_row"
)

您能否提供有关如何使用劳特巴赫 CMM 脚本逐行读取/写入 CSV 文件的信息?

【问题讨论】:

    标签: csv trace32 lauterbach


    【解决方案1】:

    您使用 OPEN 和 READ 的方式旨在读取文本文件的一行。它们不是专门为 CSV 文件制作的。虽然 CSV 文件可能在一行内有换行符(当封装在双引号中时),但普通文本文件的一行只是以换行符结尾。

    所以我认为您在这里有两个选择:将文件逐字节读取为二进制文件,或将整个文件加载到调试器虚拟内存 (VM) 并从那里逐字节读取。

    选项1:逐字节读取文件

    OPEN #1 "&csv_name" /Read /Binary
    WHILE !FILE.EOF(1)
    (
        PRIVATE &line
        GOSUB getline "1"
        RETURNVALUES &line
        IF "&line"!=""
            ECHO "&line"
    )
    CLOSE #1
    ENDDO
    
    getline:
        PARAMETERS &fh
        PRIVATE &c &last &line &inquotes
    
        &last=0
        &inquotes=FALSE()
    
        READ #&fh &c
        WHILE !FILE.EOF(&fh)
        (
            IF (&last=='"')&&(&c!='"')
                &inquotes=!&inquotes
            IF (!&inquotes)&&(&c==CONvert.CHAR(0x0A))
            (
                IF &last==CONvert.CHAR(0x0D)
                    &line=STRing.CUT("&line",-1)
                RETURN "&line"
            )
            &line="&line"+CONvert.CHAR(&c)
            &last=&c
            READ #&fh &c
        )
        RETURN "&line"
    

    选项 2:将整个文件加载到调试器虚拟内存 (VM) 并从那里逐字节读取。

    PRIVATEn &line &size &pos
    
    &pos=0    
    &size=OS.FILE.SIZE("&csv_name")
    SILENT.Data.LOAD.Binary "&csv_name" VM:&pos
    WHILE &pos<&size
    (
        GOSUB getline "1" "&pos" "&size"
        RETURNVALUES &line &pos
        IF "&line"!=""
            ECHO "&line"
    )
    CLOSE #1
    ENDDO
    
    getline:
        PARAMETERS &fh &pos &size
        PRIVATE &c &last &line &inquotes
    
        &last=0
        &inquotes=FALSE()
    
        WHILE &pos<&size
        (
            &c=Data.Byte(VM:&pos)
            &pos=&pos+1
            IF (&last=='"')&&(&c!='"')
                &inquotes=!&inquotes
            IF (!&inquotes)&&(&c==CONvert.CHAR(0x0A))
            (
                IF &last==CONvert.CHAR(0x0D)
                    &line=STRing.CUT("&line",-1)
                RETURN "&line" "&pos"
            )
            &line="&line"+CONvert.CHAR(&c)
            &last=&c
        )
        RETURN "&line" "&pos"
    

    【讨论】:

    • 您好 Holger,感谢您的回答选项 1 对我有用。
    • 嗨 Holger,当我从字符串中提取一个数字时,默认情况下它会变为十六进制值,但该值是十进制的。你知道有没有任何 cmm 脚本函数可以将字符串转换为十进制值。例如:- 从数组 [0,127,255] 如果我从上面的数组中提取第二个元素 &temp_testval=0,127,255 &Test_Value_1=STRing.TRIM(STRing.SPLIT("&temp_testval",",",1)) 默认 Test_Value1 值为 0x127 你能不能让我知道如何将 &Test_Value_1 读取为 127(十进制数)谢谢
    • 一般来说,请在 StackOverflow 上为每个新问题打开一个新问题。无论如何:十进制文字在 TRACE32 中以点为后缀。所以0x127 是十六进制,127. 是十进制,127 是使用 SETUP.RADIX 配置的任何内容。在你的情况下,我建议使用&amp;Test_Value_1=STRing.TRIM(STRing.SPLIT("&amp;temp_testval",",",1))+"."
    • 它对我有用,非常感谢你太棒了:) 下次我创建新问题时肯定会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多