【问题标题】:Combine multiple CSV files with Same Header into different group files将多个具有相同标题的 CSV 文件合并到不同的组文件中
【发布时间】:2021-06-15 00:34:51
【问题描述】:

您好,我正在寻找一种最快的解决方案来处理大量 csv 文件。

情况: 我在一个文件夹中有多个带有不同标题的 csv 文件

我已经对它们进行了预处理以删除顶部的垃圾行,所以它们都有一个标准标题

我想将一组 CSV 文件完全相同的听众合并到一个新文件夹

Single Folder:
    Tree 
    ├── 161598827330618_data_aa.csv 
    ├── ..............  
    ├── ............... 
    ├── ................ 
    ├── 161598852706227_data_bh.csv 
Note: Filenames are Random with no pattern*

示例文件-1.csv

School Name,Project Description,Construction Award,Project type,Building ID,Building Address,City,Postcode
George HS - QUEENS,New,76850000,CAP,Q298,50-51 98TH STREET,Queens,11368 
MARBLE HILL INTERNATIONAL HS -,EXT MASONRY/FLOOD/PARAPETS/ROOFS,10490000,CIP,X475,99 TERRACE VIEW AVENUE,Bronx,10463
NEW DORP HS - STATEN ISLAND,PARTIAL ACCESSIBILITY,488000,CIP,R435,465 NEW DORP LANE,Staten Island,10306

示例文件 2.csv

School Name,Project Description,Construction Award,Project type,Building ID,Building Address,City,Postcode
EAST SIDE COMMUNITY SCHOOL,FIFTH FLOOR CEILING REPLACEMENT,150000,CIP,M060,420 EAST 12 STREET,Manhattan,10009
RICHMOND HILL HS - QUEENS,STEEL DETERIORATED COLUMS & COLUMN,1064400,CIP,Q475,89-30 114 STREET,Queens,11418
SUCCESS ACADEMY CHARTER SCHOOL,INTERIOR STAIRS,2045000,CIP,M099,410 EAST 100 STREET,Manhattan,10029

示例文件-3.csv

Reporting Period,Project Number,City,County,Zip Code,Sector,Solicitation,Electric Utility
02/28/2021,2453,Youngstown,,14174,Non-Residential,ARRA Projects,National Grid
02/28/2021,218852,Queens,Queens,11356,Residential,PON 2112,Consolidated Edison
02/28/2021,220037,Warwick,Orange,10990,Residential,PON 2112,Orange and Rockland Utilities
02/28/2021,2011-230103-SLPR,Center Moriches,Suffolk,11934,Residential,Solar ARRA Funding,Long Island Power Authority

示例文件 4.csv

Reporting Period,Project Number,City,County,Zip Code,Sector,Solicitation,Electric Utility
02/28/2021,2453,Youngstown,,14174,Non-Residential,ARRA Projects,National Grid
02/28/2021,218852,Queens,Queens,11356,Residential,PON 2112,Consolidated Edison
02/28/2021,220037,Warwick,Orange,10990,Residential,PON 2112,Orange and Rockland Utilities
02/28/2021,2011-230103-SLPR,Center Moriches,Suffolk,11934,Residential,Solar ARRA Funding,Long Island Power Authority

示例文件 5.csv

OBJECTID,Borough,PSSite,ParkName,ParkZone,PSStatus,GlobalID,CreatedDate,UpdatedDate
283721,Brooklyn,Street,,,Populated,C90AAD08-D99E-4759-A64C-219D6143BFB3,07-08-15 13:10,12/20/2019 04:34:58 PM
7669836,Queens,Park,Astoria Park,Q004-ZN02,Empty,AB55A658-8276-4734-A698-5FFCAE96578E,08/13/2020 01:18:00 PM,08/20/2020 06:15:32 PM
7123408,Brooklyn,Park,Asser Levy Park,,Populated,B32D93C9-5958-4129-A87A-FA7C9A5A4E87,01-09-20 13:15,01-09-20 13:17

示例文件-6.csv

OBJECTID,Borough,PSSite,ParkName,ParkZone,PSStatus,GlobalID,CreatedDate,UpdatedDate
6036681,Manhattan,Park,Riverside Park,,Populated,6A3E747D-CD5E-43EB-9789-67DB2064E878,04-11-18 11:11,08-06-20 21:21
7170578,Bronx,Park,Garden Of Eden,,Populated,B1E8B660-4B65-437F-B61F-06B1B71A4E1C,01/28/2020 03:18:00 PM,01/28/2020 03:19:26 PM
740416,Bronx,Park,Mullaly Park,X034-ZN02,Populated,E8F51E3B-CC6F-46A3-AF17-02B6BE8DCC57,08/26/2015 04:34:00 PM,01/30/2020 04:10:41 PM
5004669,Queens,Street,,,Populated,20157769-88EC-4867-9F50-852EF4814BF0,11-02-16 16:56,08-03-20 13:12:00 AM

示例文件-7.csv

Indicator,Group,State,Subgroup,Phase,Time Period,Time Period Label,Value,Low CI,High CI,Confidence Interval
Private Health Insurance Coverage,National Estimate,United States,United States,1,1,Apr 23 - May 5,75.4,74.7,76.2,74.7 - 76.2
Public Health Insurance Coverage,By Age,United States,18 - 24 years,1,1,Apr 23 - May 5,19.5,15.4,24.3,15.4 - 24.3
Uninsured at the Time of Interview,By Gender,United States,Female,1,1,Apr 23 - May 5,11,10.3,11.7,10.3 - 11.7

示例文件-8.csv

Year, dtmSurveyDate, ColonyID, strAOUCode, Type, strPhotoInterpreters, strColonyName, strCounty, strState, strCountry
2014,03-Jun-14,219-001,COMU,Image Check - No Birds,Kirsten Bixler,"""Tillamook Head Rocks"" (Eastern Rocks)",Clatsop County,Oregon,United States
2014,03-Jun-14,219-002,COMU,Image Check - No Birds,Kirsten Bixler,"""Tillamook Head Rocks"" (Northern Rock)",Clatsop County,Oregon,United States
2014,03-Jun-14,219-003,COMU,Shapefile-RawCount,Kirsten Bixler,"""Tillamook Head Rocks"" (Southwestern Rocks)",Clatsop County,Oregon,United States
2014,03-Jun-14,219-005,COMU,Shapefile,Shawn W. Stephensen,Tillamook Rock,Clatsop County,Oregon,United States

期望的结果:

示例文件 1.csv }
Sample File-2.csv } 标头检查 > Same Header found> MERGE > GROUP-1.csv

示例文件 3.csv }
Sample File-4.csv } 标头检查 > Same Header found> MERGER > GROUP-2.csv

示例文件 5.csv }
Sample File-6.csv } 标头检查 > Same Header found > MERGER > GROUP-3.csv

Sample File-7.csv } 标题检查 > No Similar Headers > NOTHING> GROUP-5.csv
示例 File-8.csv } 标头检查 > No Similar Headers > NOTHING> GROUP-6.csv

首选解决方案:Bash 脚本和 Linux 命令 尝试过的解决方案:

#!/bin/bash
awk '
  FNR==1{
    if (!($0 in h)||file!=h[$0]){close(file)}
    if (!($0 in h)){file=h[$0]=i++}
    else{file=h[$0];next}
  }
  {print >> (file)}
' ./*.csv

https://unix.stackexchange.com/a/602291/459978

上述方法有效,但我不确定它是否可以处理 1000 多个文件进行处理和分类。 我需要在不同的文件夹中创建 Group*.csv 格式。

最短的完成时间很重要 https://stackoverflow.com/a/51921621/3088275

为 bash 脚本寻找带有 Awk 或 Sed 或 Linux 命令的操作码,以最快的速度实现所需的输出

【问题讨论】:

  • “我不确定它是否可以处理 1000 多个文件” ...您的测试表现如何?你遇到过内存不足的问题吗?过程是'slow'吗?如果是,你能详细说明'slow'是什么意思吗?
  • 在您的'预处理'期间,您是否有机会将所有标题加上相关文件名收集到一个文件中(例如, header_1:file1\nheader_1:file2\nheader-7:file3:...) ?如果是这样,您可以对所述文件进行排序(按标题),然后通过简单的bash\while 循环(或awk,如果您愿意)处理来自所述文件的行,使用第二个字段(文件名)直接执行@987654346 @
  • @markp-fuso oops 编辑了 #7、#8 进入不同的组 Group-5.csvGroup-6.csv,因为 HEADER 与文件夹中的任何一个都不匹配
  • 您的标签中有 python,如果您知道如何使用,请使用它。比您想出的任何脚本解决方案都要快。

标签: python bash shell csv awk


【解决方案1】:

您可以使用以下 AWK 脚本。我用所有示例文件对其进行了测试。

!NF { next }
NR % 3 == 1 { filename = substr($0, 5, length($0)-8) }
NR % 3 == 2 { headers[$0] = headers[$0] (headers[$0] == "" ? "" : ",") filename }

END {
  i=1
  for (header in headers) {\
    printf("Group %02d: %s\n", i, headers[header])
    split(headers[header], a, ",")
    for (idx in a) {
      getline x < a[idx]
      printf "" > sprintf("group%02d.txt", i)
      while (getline x < a[idx] > 0)
        print x >> (sprintf("group%02d.txt", i))
    }
    i++
  }
}
$ ls Sample\ File-*
Sample File-1.csv Sample File-3.csv Sample File-5.csv Sample File-7.csv
Sample File-2.csv Sample File-4.csv Sample File-6.csv Sample File-8.csv
$ head -n 1 Sample\ File-* | awk -f script.awk
Group 01: Sample File-1.csv,Sample File-2.csv
Group 02: Sample File-8.csv
Group 03: Sample File-7.csv
Group 04: Sample File-5.csv,Sample File-6.csv
Group 05: Sample File-3.csv,Sample File-4.csv
$ cat group01.txt
George HS - QUEENS,New,76850000,CAP,Q298,50-51 98TH STREET,Queens,11368
MARBLE HILL INTERNATIONAL HS -,EXT MASONRY/FLOOD/PARAPETS/ROOFS,10490000,CIP,X475,99 TERRACE VIEW AVENUE,Bronx,10463
NEW DORP HS - STATEN ISLAND,PARTIAL ACCESSIBILITY,488000,CIP,R435,465 NEW DORP LANE,Staten Island,10306
EAST SIDE COMMUNITY SCHOOL,FIFTH FLOOR CEILING REPLACEMENT,150000,CIP,M060,420 EAST 12 STREET,Manhattan,10009
RICHMOND HILL HS - QUEENS,STEEL DETERIORATED COLUMS & COLUMN,1064400,CIP,Q475,89-30 114 STREET,Queens,11418
SUCCESS ACADEMY CHARTER SCHOOL,INTERIOR STAIRS,2045000,CIP,M099,410 EAST 100 STREET,Manhattan,10029
$ cat group02.txt
02/28/2021,2453,Youngstown,,14174,Non-Residential,ARRA Projects,National Grid
02/28/2021,218852,Queens,Queens,11356,Residential,PON 2112,Consolidated Edison
02/28/2021,220037,Warwick,Orange,10990,Residential,PON 2112,Orange and Rockland Utilities
02/28/2021,2011-230103-SLPR,Center Moriches,Suffolk,11934,Residential,Solar ARRA Funding,Long Island Power Authority

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2013-04-15
    • 2016-03-20
    • 2018-10-22
    相关资源
    最近更新 更多