2017-12-21 1 views
-1

를 사용하여 CSV 파일에있는 문자열에서 특정 필드의 공백을 선행 및 후행 제거하는 방법을 우리가 간다 입력 : 내가 정규식 시도다음은 정규 표현식

X,XXXXX,XXXXXX, YYYYYY ,TTTTTTT,XXXXXXX,XXXXX XXXX 
Y,YYYYY,YYYYYY,YYY, XXXXXXX ,TTTTTT,XX XXXX,XX 

: s/\s//g을하지만 대체가 아무 곳 ALL 공백을 대체한다 끈.

전체 문자열에서 특정 필드를 잘라내어 추적하는 정규식을 제안 하시겠습니까 ??

예상 출력된다 :

X,XXXXX,XXXXXX,YYYYYY,TTTTTTT,XXXXXXX,XXXXX XXXX 
Y,YYYYY,YYYYYY,YYY,XXXXXXX,TTTTTT,XX XXXX,XX 

해당 특정 필드의 전후 스페이스 제거. 그리고 이미 공간이있는 다른 분야를 방해하지 않을 것입니다.

+0

예상되는 결과는 무엇입니까? –

+1

"_expected output_"이 (가) 귀하의 설명에 완전히 동의하지 않습니다 – zdim

답변

1

참고 필드 내부 엄격없이 쉼표로 도시 된 바와 같이이 더 많거나 적은 문자열에 관한  , .

문제가 일반 CSV 파일과 관련된 경우 정규식을 고려하지 마십시오. 모듈을 사용하여 파일을 구문 분석하고 원하는 필드를 선택하십시오. 가장 염두에 두는 것은 recent post입니다 (여기서 이 아니며 용도로는 allow_whitespace). 더 많은 것이 있습니다. 검색하십시오.


캡처 비 콤마 문자로 공백 모든 필드,

my @m = $string =~ /([^,]+)/g; 

당신이 원하는 것을 정리하고

$m[2] =~ s/^\s+|\s+$//g; 
$string = join '', @m; 

참고 다시 조인이 제거 빠른 공백은 따로, s/^\s+//; s/\s+$//;


또는 손질 분야에서 여러 단어가없는 문자열에 대한

perl -Mstrict -wE' 
    $_ = q(xxx , yyy ,hey,zz , aaa); say; 
    my $N = 2; 
    my $c; 
    s/(\s*([^, ]+)\s*)/++$c==$N ? $2 : $1/eg; say 
' 

인쇄

 
xxx , yyy ,hey,zz , aaa 
xxx ,yyy,hey,zz , aaa 

또는 문자열 필드

perl -Mstrict -wE' 
    $_ = q(xxx , yyy more ,hey,zz oo , aaa); say; 
    my $N = 2; 
    my $c; 
    s/(\s*((?:[^,]+)?[^, ])\s*)/++$c==2 ? $2 : $1/gex; say 
' 

에 대한이 작품에 여러 단어가있을 수 있습니다 경우 모두 $N부터 1..5

+0

그 정규식은 CSV 필드를 분할하기에 부적합합니다 – ysth

+1

@ysth 음 ... 물론 - OP 스타일 문자열을 고려하고 있습니다. 일반적으로 CSV 파일이 아닙니다. 그렇지 않으면 정규식이 의미가 없습니다. – zdim

+0

@ysth 맞아, 고마워 ... 그들이 "CSV 파일"이라고 했어 ... 한숨 – zdim

0

그래서 두 가지 가능한 대답이 있습니다. 하나는 split을 사용하며 CSV 파일이 '기본'이므로 괜찮습니다. 쉼표/​​줄 바꿈 등 따옴표는 사용하지 마십시오.

그 중 대부분을 다루기 때문에 좋은 출발점으로 추천합니다.당신이 가진 것 중 하나 Text::CSV

#!/usr/bin/env perl 
use strict; 
use warnings; 

use Text::CSV; 

my $csv = Text::CSV -> new(); 

while (my $row = $csv -> getline (\*DATA)) {  
    s/^\s+// for @$row; 
    s/\s+$// for @$row; 
    print join (",", @$row),"\n"; 
} 


__DATA__ 
X,XXXXX,XXXXXX, YYYYYY ,TTTTTTT,XXXXXXX,XXXXX XXXX 
Y,YYYYY,YYYYYY,YYY, XXXXXXX ,TTTTTT,XX XXXX,XX 

이 CSV 파일에 파일을 그것을 STDIN를 공급하거나 엽니 다 : 그것은 아무것도하지만 약간 더 복잡 경우

#!/usr/bin/env perl 
use strict; 
use warnings; 


while (<DATA>) {  
    my @row = split /,/; 
    s/^\s+// for @row; 
    s/\s+$// for @row; 
    print join (",", @row),"\n"; 
} 

__DATA__ 
X,XXXXX,XXXXXX, YYYYYY ,TTTTTTT,XXXXXXX,XXXXX XXXX 
Y,YYYYY,YYYYYY,YYY, XXXXXXX ,TTTTTT,XX XXXX,XX 

, 그것은 Text::CSV을 깰 시간이다. split으로 <>을 사용할 수 있습니다.

실제로 '정규식'솔루션이 아니며, IMO는 완전히 잘못된 도구입니다.

+0

감사합니다 Sobrique ... 그게 정말 도움이. 그러나 내가 가지고있는 또 하나의 과제는 입력 데이터가 예를 들어 X, XXXXX, XXXXXX, YYYYYY, TTTTTTT, XXXXXXX, XXXXX XXXX ,,,,,,, YYYYY YYYYY XXXXXXX TTTTTT , XX XXXX, XX ,,,,,,,,,,, 그냥 후행하고 선행 공백을 제거하고 싶습니다. 입력 문자열의 끝에 공백을 추가하려고했습니다. 제발 생각해 보라. – CodeSeeker