大型、复杂的 .csv 数据集的最佳逗号 (,) 替代方案

3

.csv 文件中,除了逗号 (,) 之外,什么是最好的单个字符或字符串用于作为列和行(类似表格)的常规处理方式?我的值包含数量和模式不可预测的逗号。

需要与 Python(最好还包括其他应用程序)兼容。我的值经常包含逗号 .,因此我一直在使用 "," 或者 "value" 模式。目前我正在使用:

"column1","column2","column3" 

然而,在这些情况下,使"正确工作通常是很麻烦的。

例如,使用","重新排序csv列:

import csv

infilename = input('Enter .csv to rearrange: ')

with open(infilename, 'r') as infile, open('reordered__'+ infilename, 'a') as outfile:
    fieldnamesout = ['B', 'C', 'A', 'D']
    fieldnamesin = ['A', 'B', 'C', 'D']
    reader = csv.DictReader(infile, delimiter=',', quotechar='"', fieldnames=fieldnamesin)
    writer = csv.DictWriter(outfile, delimiter=',', quotechar='"', fieldnames=fieldnamesout, quoting=csv.QUOTE_ALL)
    for row in reader:
        writer.writerow(row)

垂直线|,或者星号*似乎是一个不错的单字符选择,因为它们在目录和文件名中不允许使用,并且在“常规”文本中相对较少。

Q:有什么建议用于存储为文本的大型复杂数据库,其中值包含逗号和其他不寻常的字符?使用垂直线(|)代替逗号(,)有什么缺点吗?


损坏处理在哪里?如果您始终使用适当的CSV读写器,就不应该有问题。实际上,这就是使用CSV库而不是手动在逗号上拆分的全部原因。 - user8651755
我同意@Blurp的观点,我认为更好回答的问题是为什么你在使用“?”时遇到了麻烦。 - Jeff Richards
如果有x行包含5个逗号,y行包含4个逗号,z行包含6个逗号。按设计,您有多少列?(值包含可变数量的逗号) - HakariDo
如果数据已经按照CSV格式正确地进行了格式化/转义,那么这个问题很容易回答。如果没有,那么就无法确定(在后一种情况下使用不同的分隔符也不会有所帮助)。 - user8651755
我确实看到了针对 "," 分隔符的解决方法,但它们需要额外的编码步骤,并且在不同的程序中处理方式可能不同。使用 | 有什么缺点吗? - HakariDo
显示剩余5条评论
1个回答

0

当你使用逗号进行解析时,考虑CSV中逗号最常用的方式是通过用双引号(" ")将包含逗号的值括起来。

例如,如果你有一个带有以下数据的CSV文件:

Name, Age, Occupation
John, 25, Programmer
Mary, 32, Sales Manager
Tom, 28, Software Engineer, Team Lead

第三行数据的值为"软件工程师,团队领导",其中有一个逗号,这可能会导致CSV解析出现问题。为了避免这个问题,可以将该值用双引号括起来,例如:"软件工程师,团队领导"。
Name, Age, Occupation
John, 25, Programmer
Mary, 32, Sales Manager
Tom, 28, "Software Engineer, Team Lead"

如果在已经用双引号括起来的值中有双引号,您可以通过将其加倍来转义它们。例如,请考虑以下 CSV 数据:

Name, Age, Occupation
John, 25, Programmer
Mary, 32, Sales Manager
Tom, 28, "Software Engineer, Team Lead, ""Project Manager"""

我使用PowerBasic编写了一个名为“eCSV”(转义csv)的函数:

' escape values for csv
' replace " with "" and wrap with ""
Function eCSV(ByVal s As String) As String   
   Replace $Dq With $Dq+$Dq In s
   s=$Dq+s+$Dq   
   Function=s
End Function

当我写CSV时,我会这样调用:

' write line
temp=eCSV(designation)+","
temp+=eCSV(glb)+","
temp+=eCSV(sampleID)+","
temp+=eCSV(clientName)+","
temp+=eCSV(clientID)+","
temp+=eCSV(belongsTo)+","
temp+=eCSV(saveDate)+","
temp+=eCSV(arDate)+","
temp+=eCSV(artFrom+" - "+artTo+" "+artCF)+","
temp+=eCSV(subID)+$crlf
 
print #fNumber, temp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接