2017-10-06 13 views
0

LOAD DATA INFILE 문을 사용하여 파이프로 구분 된 CSV에서 MySQL로 데이터를 가져옵니다. '\ r \ n'을 사용하여 줄을 종료합니다. 내 문제는 각 행에있는 일부 데이터가 '\ r \ n'에있어 오류가 발생합니다. 나는 데이터 내에서 '\ n'을 사용하여 줄 바꿈을 나타내는 유사한 파일을 가지고있어서 문제가 발생하지 않습니다.CSV 데이터 값에서 캐리지 리턴을 제거하십시오.

예 GOOD CSV

School|City|State|Country\r 
Harvard University|Cambridge|MA|USA\r 
Princeton University|Princeton|New 
Jersey 
|USA\r 

예 BAD CSV

School|City|State|Country\r 
Harvard University|Cambridge|MA|USA\r 
Princeton University|Princeton|New\r 
Jersey\r 
|USA\r 

사전 처리하는 식으로 CSV, SED, AWK, 또는 펄을 사용하여 여분의 캐리지 리턴을 정리하는이 있는가 열 값에? 멀티 문자의 RS 및 RT 용 GNU AWK와

+0

예 Ed, 불행하게도. 이것은 제가 주어진 형식이며 그것을 바꿀 수있는 능력이 없습니다. – Gavi

+0

행에 고정 된 수의 필드가 있습니까? –

+0

@ChrisTurner 예 고정 된 수의 필드가 있습니다. – Gavi

답변

0

:이 필드의 수를 가정

$ awk -v RS='([^|]+[|]){3}[^|]+\r\n' -v ORS= '{$0=RT; gsub(/\r/,""); sub(/\n$/,"\r\n")} 1' file | cat -v 
School|City|State|Country^M 
Harvard University|Cambridge|MA|USA^M 
Princeton University|Princeton|New 
Jersey 
|USA^M 

하는 것으로는이 분야의 다른 번호가있는 경우 (4) 그래서 그 번호로 3을 변경 마이너스 1입니다.

$ awk ' 
    BEGIN { RS="\r\n"; ORS=""; FS="|" } 
    FNR==1 { RS="([^|]+[|]){"NF-1"}[^|]+\r\n"; RT=$0 RT } 
    { $0=RT; gsub(/\r/,""); sub(/\n$/,"\r\n"); print } 
' file | cat -v 
School|City|State|Country^M 
Harvard University|Cambridge|MA|USA^M 
Princeton University|Princeton|New 
Jersey 
|USA^M 
1

이 펄에 하나 개의 가능한 솔루션입니다 : 그 첫 번째 줄에 문제가없는 경우 스크립트는 대신 입력의 첫 번째 줄을 읽어 필드의 수를 계산할 수 있습니다. 그것은 한 행을 읽고 4 개 미만의 필드가있는 경우 다음 행에서 읽기를 계속하고 4 개의 필드가있을 때까지 병합합니다. $number_of_fields의 값을 올바른 숫자로 변경하십시오.

#!/usr/bin/perl 

use strict; 
use warnings; 

my $number_of_fields=4; 

while(<STDIN>) 
    { 
    s/[\r\n]//g; 
    my @fields=split(/\|/); 
    next if($#fields==-1); 

    while($#fields<$number_of_fields-1) 
     { 
     my $nextline=<STDIN> || last; 
     $nextline =~ s/[\r\n]//g; 
     my @tmpfields=split(/\|/,$nextline); 
     next if($#tmpfields==-1); 
     $fields[$#fields] .= "\n".$tmpfields[0]; 
     shift @tmpfields; 
     push @fields,@tmpfields; 
     } 
    print join("|",@fields),"\r\n"; 
    }