如何使用 Lauterbach CMM 脚本逐行 read/write CSV 文件

How to read/write CSV file with Lauterbach CMM script row by row

我正在尝试使用 Lauterbach CMM 脚本逐行 read/write 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 脚本逐行 read/write CSV 文件的信息?

您使用 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"