2016-08-30 2 views
0

私は、たくさんのcsvファイルを持つディレクトリ構造からの出力を得ました。これらのファイルのヘッダーは手動で作成され、ランダムに配置されます。私は似たヘッダを持つファイルをすべて取得しなければなりません。セット別にグループ化します。類似のヘッダーを持つファイルをグループ化するpython

/A/B/C/D~b1.csv.0 Delim:, 
"First Name" "Last Name" Company EMAIL Phone Fax "SIC CODE" 
/A/B/C/D~b2.csv.0 Delim:, 
"First Name" "Last Name" Phone Fax "SIC CODE" Company EMAIL 
/A/B/C/D~b3.csv.0 Delim:, 
"First Name" "Last Name" Company EMAIL Fax "SIC CODE" Phone 
/A/B/C/D~b4.csv.0 Delim:, 
"First Name" "Last Name" Company EMAIL Phone Fax "SIC CODE" 
/A/B/C/D~c1.csv.0 Delim:, 
"Business Type" "Main Markets" Establised "No Of Employees" Category "Company Name" "Contact Person" Designation Address "Pin Code" "Telephone no" "Fax No" Country Website Email 
/A/B/C/D~c2.csv.0 Delim:, 
"Business Type" "Main Markets" Establised "No Of Employees" Category "Company Name" "Contact Person" Designation Address "Pin Code" "Telephone no" "Fax No" Country Website Email 
/A/B/C/D~c3.csv.0 Delim:, 
"Business Type" "Main Markets" Country Website Email Establised "No Of Employees" Category "Company Name" "Contact Person" Designation Address "Pin Code" "Telephone no" "Fax No" 

最初の部分/A/B/C/Dは、ファイルを解析するのに必要なデリミタDelim:,続い~続いディレクトリ構造です。

>>> li = [('abc', set(['a', 'c', 'b'])), ('def', set(['e', 'd', 'f'])), ('ghi', set(['i', 'h', 'g'])), ('jkl', set(['k', 'j', 'l'])), ('mno', set(['m', 'o', 'n'])), ('pqr', set(['q', 'p', 'r'])), ('stu', set(['s', 'u', 't'])), ('vwx', set(['x', 'w', 'v'])), ('ABC', set(['a', 'c', 'b'])), ('DEF', set(['e', 'd', 'f'])), ('GHI', set(['i', 'h', 'g'])), ('JKL', set(['k', 'j', 'l'])), ('MNO', set(['m', 'o', 'n'])), ('PQR', set(['q', 'p', 'r'])), ('STU', set(['s', 'u', 't'])), ('VWX', set(['x', 'w', 'v']))] 
>>> for key, group in groupby(li, lambda x: x[1]): 
...  for l in group: 
...   print "%s %s." % (l[1], l[0]) 

方法:次の行は、何かが、私が働いていないだろう知っている次のように、私は一緒にグループ同様のヘッダーへのサンプル・コードを作成しようとしました"First Name" "Last Name" Company EMAIL Phone Fax "SIC CODE"

ファイルから取り出されたヘッダでありますセットをまとめてグループ化できますか? 類似のヘッダーファイルをどのようにグループ化できるかを理解する助けとなります。

+0

:あなたの例から、あなたは、グループライン1/2と一緒に7/8にありますか? –

+0

類似のヘッダーはどういう意味ですか?たとえば、同じ列の異なる順序、同じ列のサブセット、大文字と小文字を区別しないのはどうですか? –

+0

また、ヘッダーが1回しか発生しない場合はどうすればいいでしょうか? –

答えて

1

次の方法は、各CSVヘッダーを取得し、列エントリのリストに変換することによって機能します。これらはソートされ、タプルに変換されます。これは、デフォルトの辞書のキーとして使用されます。各一致するエントリは、元の列の順序と一緒にリストに追加されます。

結果は、同じ列エントリを含むCSVファイルをグループ化する辞書です。列のエントリで大文字と小文字が区別されない場合、タプルのエントリはキーとして使用される前に小文字に変換される可能性があります。

from collections import defaultdict 
import csv 
from StringIO import StringIO 

csv_groups = defaultdict(list) 

entries = [ 
    ["/A/B/C/D~b1.csv.0", "Delim:,", '"First Name" "Last Name" Company EMAIL Phone Fax "SIC CODE"'], 
    ["/A/B/C/D~b2.csv.0", "Delim:,", '"First Name" "Last Name" Phone Fax "SIC CODE" Company EMAIL'], 
    ["/A/B/C/D~b3.csv.0", "Delim:,", '"First Name" "Last Name" Company EMAIL Fax "SIC CODE" Phone'], 
    ["/A/B/C/D~b4.csv.0", "Delim:,", '"First Name" "Last Name" Company EMAIL Phone Fax "SIC CODE"'], 
    ["/A/B/C/D~c1.csv.0", "Delim:,", '"Business Type" "Main Markets" Establised "No Of Employees" Category "Company Name" "Contact Person" Designation Address "Pin Code" "Telephone no" "Fax No" Country Website Email'], 
    ["/A/B/C/D~c2.csv.0", "Delim:,", '"Business Type" "Main Markets" Establised "No Of Employees" Category "Company Name" "Contact Person" Designation Address "Pin Code" "Telephone no" "Fax No" Country Website Email'], 
    ["/A/B/C/D~c3.csv.0", "Delim:,", '"Business Type" "Main Markets" Country Website Email Establised "No Of Employees" Category "Company Name" "Contact Person" Designation Address "Pin Code" "Telephone no" "Fax No"'] 
] 

for folder, delim, header in entries: 
    cols = tuple(sorted(list(csv.reader(StringIO(header), delimiter=' ', skipinitialspace=True))[0])) 
    csv_groups[cols].append((folder, header)) 

for csv_type, folders in csv_groups.iteritems(): 
    print csv_type 

    for folder in folders: 
     print " ", folder 

これはあなたのデータをもとに、あなたに次のグループを与えるだろう:私の理解のために

('Address', 'Business Type', 'Category', 'Company Name', 'Contact Person', 'Country', 'Designation', 'Email', 'Establised', 'Fax No', 'Main Markets', 'No Of Employees', 'Pin Code', 'Telephone no', 'Website') 
    ('/A/B/C/D~c1.csv.0', '"Business Type" "Main Markets" Establised "No Of Employees" Category "Company Name" "Contact Person" Designation Address "Pin Code" "Telephone no" "Fax No" Country Website Email') 
    ('/A/B/C/D~c2.csv.0', '"Business Type" "Main Markets" Establised "No Of Employees" Category "Company Name" "Contact Person" Designation Address "Pin Code" "Telephone no" "Fax No" Country Website Email') 
    ('/A/B/C/D~c3.csv.0', '"Business Type" "Main Markets" Country Website Email Establised "No Of Employees" Category "Company Name" "Contact Person" Designation Address "Pin Code" "Telephone no" "Fax No"') 
('Company', 'EMAIL', 'Fax', 'First Name', 'Last Name', 'Phone', 'SIC CODE') 
    ('/A/B/C/D~b1.csv.0', '"First Name" "Last Name" Company EMAIL Phone Fax "SIC CODE"') 
    ('/A/B/C/D~b2.csv.0', '"First Name" "Last Name" Phone Fax "SIC CODE" Company EMAIL') 
    ('/A/B/C/D~b3.csv.0', '"First Name" "Last Name" Company EMAIL Fax "SIC CODE" Phone') 
    ('/A/B/C/D~b4.csv.0', '"First Name" "Last Name" Company EMAIL Phone Fax "SIC CODE"')   
+0

私は同じソートリストを使用しました。このコードははるかにクリーンです。 –

関連する問題