Как читать / записывать CSV-файл с помощью сценария Lauterbach CMM строка за строкой - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь читать / записывать файл CSV строка за строкой, используя сценарий Lauterbach CMM, но он не работает.

Я подумал, что могу прочитать каждую строку файла CSV как каждую строку, если я прочитал csvкак обычный файл, но это не так, если вы используете символы LF в данных ячейки: чтение файла CSV построчно будет прекращено. Я имею в виду сценарий читает строку как частично.

Не могли бы вы дать мне знать, чтобы читать CSV-файл строка за строкой?

Мой код для чтения CSV строка за строкой:

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

Можете ли вы предоставить информацию окак читать / записывать CSV-файл строка за строкой, используя скрипт Lauterbach CMM?

1 Ответ

0 голосов
/ 01 ноября 2019

То, как вы используете 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"
...