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