如何使用Lauterbach CMM脚本逐行读取/写入CSV文件

如何使用Lauterbach CMM脚本逐行读取/写入CSV文件,csv,trace32,lauterbach,Csv,Trace32,Lauterbach,我正在尝试使用Lauterbach CMM脚本逐行读取/写入CSV文件,但它不起作用 如果我将CSV作为普通文件读取,我想我可以将CSV文件的每一行作为每一行读取,但如果在单元格数据中使用LF字符,则情况并非如此:逐行读取CSV文件将被终止。我的意思是脚本将行读取为部分 你能让我知道如何逐行读取CSV文件吗 逐行读取CSV的我的代码: OPEN #1 &csv_name /Read WHILE !FILE.EOF(1) ( READ #1 %LINE &csv_row

我正在尝试使用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"
)

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

您使用“打开并读取”的方式旨在读取文本文件的一行。它们不是专门为CSV文件制作的。虽然CSV文件可能在一行中包含换行符(封装在双引号中时),但普通文本文件的一行仅以换行符结尾

所以我认为这里有两种选择:以二进制文件的形式逐字节读取文件,或者将整个文件加载到调试器虚拟内存(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"
选项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"
PRIVATEn&line&size&pos
&pos=0
&size=OS.FILE.size(&csv\u名称)
SILENT.Data.LOAD.Binary“&csv\u name”虚拟机:&pos

WHILE&posHi-Holger,感谢回答选项1为我所用。Hi-Holger,当我从字符串中提取一个数字时,默认值为十六进制值,但值为十进制。您知道有没有cmm脚本函数将字符串转换为十进制值。Ex:-从数组[0127255]如果我从上面的数组中提取scond元素&temp_testval=0127255&Test_Value_1=STRing.TRIM(STRing.SPLIT(&temp_testval“,”,“,1)),默认情况下,Test_Value 1的值是0x127,请告诉我如何读取并测试_Value_1为127(十进制数)谢谢,总的来说,请为每个新问题打开一个关于StackOverflow的新问题。无论如何:十进制文字在TRACE32中以一个点作为后缀。所以
0x127
是十六进制,
127.
是十进制,
127
是用SETUP.RADIX配置的。在您的情况下,我建议使用
&Test\u Value\u 1=STRing.TRIM(STRing.SPLIT(“&temp\u testval”,“,”,1))+“
它对我很有效,非常感谢您的出色:)当然,下次我再提出新问题。