헤더가 동일한 여러 CSV 파일을 여러 그룹 파일로 병합

헤더가 동일한 여러 CSV 파일을 여러 그룹 파일로 병합

안녕하세요. 저는 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

원하는 결과:

예시 File-1.csv }
예시 File-2.csv } 헤더 확인 > Same Header found> 병합 >GROUP-1.csv

예시 파일-3.csv }
예시 파일-4.csv } 헤더 확인 > Same Header found> 병합 >GROUP-2.csv

예시 File-5.csv }
예시 File-6.csv } 헤더 확인 > Same Header found> 병합 >GROUP-3.csv

샘플 파일-7.csv } 헤더 확인 > No Similar Headers > 없음 > GROUP-5.csv
샘플 파일-8.csv } 헤더 확인 > No Similar Headers > 없음 >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 위의 방법은 효과가 있지만 처리 및 분류를 위해 수천 개의 파일을 처리할 수 있는지 확실하지 않습니다. 다른 폴더에 Group*.csv 형식을 만들어야 합니다.

최소 완료 시간이 중요합니다 https://stackoverflow.com/a/51921621/3088275

Awk, Sed 또는 Linux 명령 중 원하는 출력을 얻는 데 가장 빠른 명령을 사용하여 bash 스크립트에 대한 작업 코드를 찾습니다.

답변1

중복 헤더는 인접한 파일에서만 발견됩니까? 이 답변을 통해 이것이 사실이 아닌 경우 처리하고 싶습니다.

#!/bin/bash

# Declare header_list[] to be an associative array
declare -A header_list

# Read the first line from every *.csv file in $1
# Each filename is added to the appropriate entry in header_list[]
for f in "${1:?}"/*.csv; do
  echo "### Reading header from $f"
  header_list[$(head -1 "$f")]+="${IFS}$f"
done

# Handle the list of files for each entry in header_list[]
group_id=1
for key in "${!header_list[@]}"; do
  value="${header_list[$key]}"
  groupfile="${2:?}/GROUP-${group_id}.csv"
  echo "### Header: ${key}"
  echo "### Group File: ${groupfile}"
  
  # Echo the header as the first line of $groupfile
  echo "${key}" > "${groupfile}"
  
  # Skip the first line, but echo every other line from each file with this header
  for file in ${value}; do
  echo "# File: ${file}"
    tail --lines=+2 "$file" >> "${groupfile}"
  done
  
  # Increment group_id
  (( group_id++ ))
done

파일에 저장하고 소스 파일이 포함된 디렉터리와 출력 디렉터리라는 두 가지 매개변수를 사용하여 실행합니다.

몇 가지 참고사항:

  • 출력 디렉터리가 있어야 합니다.
  • $IFS에 문자가 포함된 파일 이름은 올바르게 처리되지 않습니다.

관련 정보