Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/CSV唯一行,列中每行具有唯一值_Python_Csv - Fatal编程技术网

Python/CSV唯一行,列中每行具有唯一值

Python/CSV唯一行,列中每行具有唯一值,python,csv,Python,Csv,拥有此数据集时,数据集是虚构的: cat sample.csv id,fname,lname,education,gradyear,attributes "6F9619FF-8B86-D011-B42D-00C04FC964FF",john,smith,mit,2003,qa "6F9619FF-8B86-D011-B42D-00C04FC964FF",john,smith,harvard,2007,"test|admin,test" "6F9619FF-8B86-D011-B42D-00C

拥有此数据集时,数据集是虚构的:

cat sample.csv 

id,fname,lname,education,gradyear,attributes
"6F9619FF-8B86-D011-B42D-00C04FC964FF",john,smith,mit,2003,qa
"6F9619FF-8B86-D011-B42D-00C04FC964FF",john,smith,harvard,2007,"test|admin,test"
"6F9619FF-8B86-D011-B42D-00C04FC964FF",john,smith,harvard,2007,"test|admin,test"
"6F9619FF-8B86-D011-B42D-00C04FC964FF",john,smith,ft,2012,NULL
"6F9619FF-8B86-D011-B42D-00C04FC964F1",john,doe,htw,2000,dev
当我运行此脚本时,它会解析csv并查找唯一的行,当找到更多行时,在列中指定行:

parse-csv.py

import itertools

from itertools import groupby
import csv
import pprint
import argparse

if __name__ == '__main__':
        parser = argparse.ArgumentParser(description='sql dump parser')
        parser.add_argument('-i','--input', help='input file', required=True)
        parser.add_argument('-o','--output', help='output file', required=True)
        args = parser.parse_args()
        inputf = args.input
        outputf = args.output


t = csv.reader(open(inputf, 'rb'))
t = list(t)


def join_rows(rows):
    return [(e[0] if i < 1 else '|'.join(e)) for (i, e) in enumerate(zip(*rows))]

myfile = open(outputf, 'wb')
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL, lineterminator='\n')

for name, rows in groupby(t, lambda x:x[0]):
    wr.writerow(join_rows(rows))
    #print join_rows(rows)
它适用于sample.csv

输出:

$ python parse-csv.py -i sample.csv -o sample-out.csv
$ python unique.py -i sample-out.csv -o sample-final.csv

$ cat sample-final.csv

"id","fname","lname","education","gradyear","attributes"
"6F9619FF-8B86-D011-B42D-00C04FC964FF","john","smith","mit|harvard|ft","2003|2007|2012","qa|test|admin,test|NULL"
"6F9619FF-8B86-D011-B42D-00C04FC964F1","john","doe","htw","2000","dev"
但当我为这个做同样的事情时:

(数据集是虚构的)

sample2.csv

id,lastname,firstname,middlename,address1,address2,city,zipcode,city2,zipcode2,emailaddress,website
"E387F3C1-F6E9-40DD-86AB-A7149C67F61C","Technical Support",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
"648EEB5D-0586-444A-B86F-4EB2446BBC93","Palm","Samuel","J",NULL,NULL,NULL,NULL,NULL,NULL,"",NULL
"A94FAD4E-27DB-48FE-B89E-C37B408C5DD5","Mait","A.V.",NULL,NULL,NULL,NULL,NULL,NULL,NULL,"mait@yahoo.com",NULL
"E387F3C1-F6E9-40DD-86AB-A7149C67F61C","Technical Support",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
"648EEB5D-0586-444A-B86F-4EB2446BBC93","Palm","Samuel","J",NULL,NULL,NULL,NULL,NULL,NULL,"",NULL
"A94FAD4E-27DB-48FE-B89E-C37B408C5DD5","Mait","A.V.",NULL,NULL,NULL,NULL,NULL,NULL,NULL,"mait@yahoo.com",NULL
"FDFCA22A-EE19-4997-B892-90B2006FE328","Drago","Paul",NULL,"","","","",NULL,NULL,"psd@gmail.com",NULL
"FDFCA22A-EE19-4997-B892-90B2006FE328","Drago","Paul",NULL,"","","","",NULL,NULL,"psd@gmail.com",NULL
"FDFCA22A-EE19-4997-B892-90B2006FE328","Drago","Paul",NULL,"","","","",NULL,NULL,"psd@gmail.com",NULL
"FDFCA22A-EE19-4997-B892-90B2006FE328","Drago","Paul",NULL,"","","","",NULL,NULL,"psd@gmail.com",NULL
"FDFCA22A-EE19-4997-B892-90B2006FE328","Drago","Paul",NULL,"","","","",NULL,NULL,"psd@gmail.com",NULL
输出为:

$ python parse-csv.py -i sample2.csv -o sample2-out.csv
$ python unique.py -i sample2-out.csv -o sample2-final.csv
$ cat sample2-final.csv

"id","lastname","firstname","middlename","address1","address2","city","zipcode","city2","zipcode2","emailaddress","website"
"E387F3C1-F6E9-40DD-86AB-A7149C67F61C","Technical Support","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL"
"648EEB5D-0586-444A-B86F-4EB2446BBC93","Palm","Samuel","J","NULL","NULL","NULL","NULL","NULL","NULL","","NULL"
"A94FAD4E-27DB-48FE-B89E-C37B408C5DD5","Mait","A.V.","NULL","NULL","NULL","NULL","NULL","NULL","NULL","mait@yahoo.com","NULL"
"E387F3C1-F6E9-40DD-86AB-A7149C67F61C","Technical Support","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL"
"648EEB5D-0586-444A-B86F-4EB2446BBC93","Palm","Samuel","J","NULL","NULL","NULL","NULL","NULL","NULL","","NULL"
"A94FAD4E-27DB-48FE-B89E-C37B408C5DD5","Mait","A.V.","NULL","NULL","NULL","NULL","NULL","NULL","NULL","mait@yahoo.com","NULL"
"FDFCA22A-EE19-4997-B892-90B2006FE328","Drago","Paul","NULL","","","","","NULL","NULL","psd@gmail.com","NULL"
为什么它不能像在sample.csv中那样正确地获得唯一的行和列

有人有什么想法吗


提前谢谢!很长一段时间以来一直在考虑这个问题……

您的第一个文件已排序,而第二个文件未排序。请看

您所需要的就是:

t = list(t)
t[1:] = sorted(t[1:])

以下是我用字典简单地解决你的问题(据我所知):

import csv


t = csv.reader(open("sample2.csv", 'rb'))
t = list(t)


def parsecsv(data):
    # Assumes that the first column is the unique id and that the first
    # row contains the column titles and that all rows have same # of columns
    L = len(data[0])
    csvDict = {}

    for entry in data: # build a dict csvDict to represent data
        if entry[0] in csvDict: # already have entry so add to it...
            for i in range(L - 1): # loop through columns
                if csvDict[entry[0]][i] != 'NULL': #check if data exists in column
                    if (entry[i] not in csvDict[entry[0]][i]) and (entry[i] != 'NULL'):
                        csvDict[entry[0]][i] += '|' + entry[i]
                else:
                    csvDict[entry[0]][i] = entry[i]
        else:
            csvDict[entry[0]] = [None]*(L - 1)
            for i in range(L - 1): # loop through columns
                csvDict[entry[0]][i] = entry[i]
    return csvDict

out = parsecsv(t)

for entry in out:
    print entry + ' = ' + str(out[entry])
这应该独立于已排序的数据集等


如果有帮助,请告诉我

您有完全相同的
“FDFCA22A-EE19-4997-B892-90B2006FE328”、“Drago”、“Paul”
行。它不应该合并为一行,完全相同的数据吗?是的,对于这一行它可以工作,但是对于其他行,例如“648EEB5D-0586-444A-B86F-4EB2446BBC93”、“Palm”、“Samuel”、“J”。。。。困惑的它适用于sample.csvPalm Samuel行也是相同的…是的,如果一个人有许多行用于一个列,那么输出应该只有唯一的行,每个列都有唯一的值。没问题,很高兴它有帮助!
import csv


t = csv.reader(open("sample2.csv", 'rb'))
t = list(t)


def parsecsv(data):
    # Assumes that the first column is the unique id and that the first
    # row contains the column titles and that all rows have same # of columns
    L = len(data[0])
    csvDict = {}

    for entry in data: # build a dict csvDict to represent data
        if entry[0] in csvDict: # already have entry so add to it...
            for i in range(L - 1): # loop through columns
                if csvDict[entry[0]][i] != 'NULL': #check if data exists in column
                    if (entry[i] not in csvDict[entry[0]][i]) and (entry[i] != 'NULL'):
                        csvDict[entry[0]][i] += '|' + entry[i]
                else:
                    csvDict[entry[0]][i] = entry[i]
        else:
            csvDict[entry[0]] = [None]*(L - 1)
            for i in range(L - 1): # loop through columns
                csvDict[entry[0]][i] = entry[i]
    return csvDict

out = parsecsv(t)

for entry in out:
    print entry + ' = ' + str(out[entry])