let $removeLastCR:=fn:replace($output.output_FileContent , '(\r?\n|\r)$', '')
let $lines := tokenize($removeLastCR, '\n')
return
for $line at $counter in $lines
let $x :=
for $i in fn:tokenize($line,'"')
return
if(fn:starts-with($i,',') and fn:ends-with($i,','))
then fn:substring($i,2,fn:string-length($i)-2)
else
if(fn:starts-with($i,','))
then fn:substring-after($i,',')
else
if(fn:ends-with($i,','))
then fn:substring($i,1,fn:string-length($i)-1)
else $i
let $fields :=
for $j at $k in $x
return
if(fn:starts-with($line,'"'))
then
if($k mod 2 = 0)
then fn:tokenize($j,',')
else $j
else
if($k mod 2 = 0)
then $j
else fn:tokenize($j,',')
return真正的问题是,我试图理解为什么对下面的数据记录进行解析失败,但是对文件中的其余数据(File是一个.CSV文件)有效:
xyz@example.com,XYZ LastName,Merchant,15/08/2022,199.98,美元,199.98,美元,61001,xyz@example.com R1111111,"Qty 10-4“”X4“”X 5.7“-颜色:自定义框1,XYZ,CC 8月1日,R1111111,P&E : PS,妈妈,政策,CCP,https://www.example.com/report?reportID=R1111111,cdf,1234XXXXXX5678,https://example.com,
对于上面的记录,代码应该将每个逗号分隔的值解析到它自己的字段中(Field1: xyz@example.com、Field2: XYZ LastName等),但我认为它在字段值“Qty10-4”“X4”“X5.7”“- Color: Custom 1”上会出现分叉。它应该将整个值解析为一个字段,但是它只将“Qty10-4”输入到Field#13中,而且之后的所有字段也都没有被正确地解析。
因此,我试图更好地理解这段代码(是别人编写的),这样我就可以进行适当的更改来处理这个场景。
发布于 2022-11-10 08:49:18
CSV语法有很多变体,看起来这个数据文件使用的是在引用字段中通过加倍引号转义"的约定。但是,解析CSV的查询代码并不试图处理此类转义引号。
很容易告诉您每一行代码做什么,但我怀疑这不是您的问题。更难的是理解整个逻辑。
第一部分通过在$x上标记并从每个令牌中移除前导和尾随逗号来创建变量"。这对我来说毫无意义。第二部分则取没有引号的标记,并将它们拆分到",“分隔符上。
我认为这段代码已经被破坏了,当然不能扩展到处理通过加倍转义的引号。它需要重写。我不认为简单的标记就能做到这一点。
googling显示了CSV到XML转换器的各种尝试。不幸的是,他们中很少有人非常明确地知道他们处理的CSV到底是什么味道,而且许多人甚至没有尝试在引用的字段中处理逗号。不太满意,但我恐怕在我允许自己回答StackOverflow问题的10分钟内写一个更好的答案是不可能的。
https://stackoverflow.com/questions/74382156
复制相似问题