Files
Nim/tests/stdlib/tparsecsv.nim
cui fliter 792e21dd9e parsecsv: reset parser state when reopening (#26197)
`CsvParser.open` did not reset parser-specific state when reopening a
parser.

After parsing one input and reusing the same parser for another input,
the previous `row`, `headers`, and `processedRows()` value could remain
visible. In particular, calling `readHeaderRow()` on an empty second
input did not clear the previous headers.

Reset the parser state in `open`:

- clear `row`
- clear `headers`
- reset `currRow` to zero

Signed-off-by: cuishuang <imcusg@gmail.com>
2026-09-09 21:25:14 +02:00

58 lines
1.4 KiB
Nim

discard """
matrix: "--mm:refc; --mm:orc"
"""
include parsecsv
import strutils, os
import std/assertions
block: # Tests for reading the header row
let content = "\nOne,Two,Three,Four\n1,2,3,4\n10,20,30,40,\n100,200,300,400\n"
writeFile("temp.csv", content)
var p: CsvParser
p.open("temp.csv")
p.readHeaderRow()
while p.readRow():
let zeros = repeat('0', p.currRow-2)
doAssert p.rowEntry("One") == "1" & zeros
doAssert p.rowEntry("Two") == "2" & zeros
doAssert p.rowEntry("Three") == "3" & zeros
doAssert p.rowEntry("Four") == "4" & zeros
p.close()
when not defined(testing):
var parser: CsvParser
parser.open("temp.csv")
parser.readHeaderRow()
while parser.readRow():
echo "new row: "
for col in items(parser.headers):
echo "##", col, ":", parser.rowEntry(col), "##"
parser.close()
removeFile("temp.csv")
# Tidy up
removeFile("temp.csv")
block: # Reopening a parser resets its state
var p: CsvParser
var first = newStringStream("A,B\n1,2\n")
p.open(first, "first.csv")
p.readHeaderRow()
doAssert p.readRow()
doAssert p.processedRows() == 2
p.close()
first.close()
var second = newStringStream("")
p.open(second, "second.csv")
doAssert p.processedRows() == 0
doAssert p.row.len == 0
doAssert p.headers.len == 0
p.readHeaderRow()
doAssert p.headers.len == 0
p.close()
second.close()