Python解析CSV,分隔符与标点符号混淆

Python解析CSV,分隔符与标点符号混淆,python,csv,parsing,Python,Csv,Parsing,我有一个带有逗号分隔符的CSV文件,5列,第一列和第二列-文本。在本文中,有时有很多逗号,有时在行的末尾,一行中有多个逗号 Type,Category,Count,LAT,LON xxx,yyy/yyy,362,36.0121,-106.65801,,, zz zz,zz -zz,xxx,2539,35.39353,-106.501916,,, cc,dd,527,35.330102,-106.505023 ... 感谢您对如何有效修复它的帮助 现在,在阅读之前,我停止删除行文件中所有的结尾“

我有一个带有逗号分隔符的CSV文件,5列,第一列和第二列-文本。在本文中,有时有很多逗号,有时在行的末尾,一行中有多个逗号

Type,Category,Count,LAT,LON
xxx,yyy/yyy,362,36.0121,-106.65801,,,
zz zz,zz -zz,xxx,2539,35.39353,-106.501916,,,
cc,dd,527,35.330102,-106.505023
...
感谢您对如何有效修复它的帮助

现在,在阅读之前,我停止删除行文件中所有的结尾“,”

下一步:也许从右到左检查-如果在数字组之后有字符串-考虑第一部分为“代码>类别< /代码>,所有其他到行的开始-删除逗号。< /P> 有什么想法吗


UPD:模式-看起来似乎只有在第一列中有过多的逗号。所以只需要从右到左读取4列,其他所有内容都合并到第一列“键入”。

您对该文件有控制权吗?无论是谁生成的,都应该使用引号对字符串进行转义(引号之间的逗号应该被忽略)。或者他们可以选择使用不在数据中的字符作为列分隔符(如管道符号
|


如果您无法控制生成文件,我不确定最好的方法。如果您知道逗号出现的位置,您可能可以编写一个脚本,首先找到您要查找的模式(通过regex)并将其转义,如上文所述。

您是否能够再次导出csv,或者是否有足够的行可以手动更新?通常,当csv文件上有逗号时,通常的做法是将文本用双引号括起来

如果不可能,我将执行以下操作:

  • 分为四列,第一列全部为文本
  • 获取类型或类别的列表(以较容易获得的为准),并根据列表中存在的子字符串将列拆分为两个

  • 祝你好运

    在示例中从

    x,x,x,yyy/yyy,362,36.0121,-106.65801,,,
    z,z zz,zz -zz,xxx,2539,35.39353,-106.501916,,,
    c,c,dd,527,35.330102,-106.505023
    
    跑步

    <input.txt sed -r 's/^(.+?),([^,]+),([0-9]+),(-?[0-9]+\.[0-9]+),(-?[0-9]+\.[0-9]+)(,{0,})$/\1\t\2\t\3\t\4\t\5/'
    
    我已经应用了这个正则表达式


    它只是sed而不是Python,但是您可以在Python中使用相同的正则表达式。

    现在,我已经提出了以下解决方案: 它很慢,不优雅,但很有效

    @Aboruso的正则表达式解决方案也很棒

    COLUMNAMOUNT = 5 #
    with open(os.path.join('data', 'messed.csv')) as csv, open('new.csv','w') as result:
            for line in csv:
                line = line[:-1].rstrip(',') + line[-1]
                line = line.split(',')
                l = len(line)
                if l > COLUMNAMOUNT:
                    line[l-COLUMNAMOUNT] = ''.join(line[:l-COLUMNAMOUNT+1])
                result.write(','.join(line[l-COLUMNAMOUNT:]))
    
    无控制(附加逗号和不带引号的文本。模式-几乎总是只在第一行附加逗号。
    COLUMNAMOUNT = 5 #
    with open(os.path.join('data', 'messed.csv')) as csv, open('new.csv','w') as result:
            for line in csv:
                line = line[:-1].rstrip(',') + line[-1]
                line = line.split(',')
                l = len(line)
                if l > COLUMNAMOUNT:
                    line[l-COLUMNAMOUNT] = ''.join(line[:l-COLUMNAMOUNT+1])
                result.write(','.join(line[l-COLUMNAMOUNT:]))