2009-08-13 6 views
3

나는 다음과 같은 형식의 CSV 파일이 :분석 CSV 파일은 이전 버전과

CSV FILE 
"a"    , "b"  , "c" , "d" 
hello, world , 1  , 2 , 3 
1,2,3,4,5,6,7 , 2  , 456 , 87 
h,1231232,3  , 3  , 45 , 44 

문제는 첫 번째 필드가 쉼표를 ","가지고 있다는 것입니다. 필자는 파일 생성을 제어 할 수 없습니다. 파일 형식을 받아 들일 수 있습니다. 줄 끝에서 시작 부분까지 CSV 파일을 거꾸로 읽을 수 있습니까?

내가 올바른 방향으로 인도한다면, 약간의 파이썬 스크립트를 작성해도 괜찮습니다.

+2

어쩌면 그는 고정 길이 필드처럼 보이게 만들 수 있습니까? 첫 번째 필드에 따옴표 문자가없는 구분 기호가 포함 된 경우 형식이 제대로 지정된 CSV가 아닙니다. – davewasthere

+1

그것은 CSV가 아닙니다. 따라서 CSV 구문 분석 기술을 사용할 수 없습니다. 쉼표를 사용하는 다른 형식이지만 CSV가 아닙니다. CSV라고 부르는 것을 중단하십시오. "CSV와 같은"또는 "임의의 쉼표 값"이라고합니다. –

답변

15

rsplit 문자열 방법은 왼쪽 대신 오른쪽에서 시작하는 문자열을 분할, 그래서 당신이 찾고있는 아마 (걸리는 인수가 지정 분할 배의 최대 수) : 당신이 당신의 갈라 목록의 각 항목의 시작 부분과 끝 부분의 공백을 제거하려면

line = "hello, world , 1  , 2 , 3" 
parts = line.rsplit(",", 3) 
print parts # prints ['hello, world ', ' 1  ', ' 2 ', ' 3'] 

, 당신은 단지 지능형리스트로 strip 방법을 사용할 수 있습니다

parts = [s.strip() for s in parts] 
print parts # prints ['hello, world', '1', '2', '3'] 
+1

큰 활자로 고맙다 번들 – dassouki

1
당신은 항상 정규식의 뭔가 같은 (펄 정규식)

#!/usr/bin/perl 

use IO::File; 

if (my $file = new IO::File("test.csv")) 
{ 
    foreach my $line (<$file>) { 
    $line =~ m/^(.*),(.*?),(.*?),(.*?)$/; 
    print "[$1][$2][$3][$4]\n"; 
    } 
} else { 
    print "Unable to open test.csv\n"; 
} 

편집 (첫 번째는 욕심 검색, 지난 3없는입니다)를 할 수

: 전체 코드를 게시하는 대신 단지 정규식

+5

http://xkcd.com/208/ –

1

문자열을 먼저 반전 한 다음 처리하십시오.

의 tmp = tmp를 [:: - 1]

1

제공된 샘플에서 "열"은 고정 크기입니다. 첫 번째 파일 (쉼표가있는 파일)은 16 자입니다. 그렇다면 파일을 한 줄씩 읽은 다음 처음 16 자 (첫 번째 열의 값으로)를 읽는 각 줄마다 나머지 파일을 읽으려고합니까? 각 값을 얻은 후에는 더 자세히 파싱 할 수 있습니다 (공백을 트리밍하는 등 ...).

+0

방금 ​​기분을 들여 놓았습니다 – dassouki

1

CSV 파일이 아닙니다. 콤마로 구분하면됩니다. 당신이이 아닌 확신 할 수있는 방법

: 필드 이름이 필드 쉼표를 포함 너무 홀수 것처럼 그런 다음 첫 번째 그룹은 따옴표로 둘러싸여해야 함을 의미합니다 같은 파일이

CSV FILE 
"a"    , "b"  , "c" , "d" 
hello   , world , 1 , 2 , 3 
1    , 2  , 3 , 4 , 5,6,7,2,456,87 
h    , 1231232 , 3 , 3 , 45,44 

경우, 보이는 그렇지 않습니다.

원본 소스에서 오류를 해결하는 팬이 아닙니다. 데이터 생성기로 돌아가 올바른 CSV를 제공하도록 요청합니다.

+0

좋은 점은 있지만 형식에 대해서는 확신합니다. 마지막으로 100 %입니다. 세 개의 열은 int 유형입니다. 우리는 파일을 그대로 수신합니다. 우리는 세대를 통제 할 수 없습니다. 지옥, 나는 그들이 무엇을 생성하는데 사용하는지 모르겠다. – dassouki

+0

내가 가장 좋아하는 따옴표 중 하나는 "나는 IT 표준을 좋아한다. 선택할 수있는 것이 너무 많다!" 누락 된 점은 많은 표준 중 하나를 선택한 후에도 수천 가지 방법으로이를 격발시킬 수 있다는 것입니다. 다행히 해결책을 찾았는지 알고 싶습니다. Regex 솔루션도 상당히 좋아졌지만 프로세서 기반의 프로그래머가 많았습니다. 당신의 가공에 행운을 비네! – Lazarus

0

항상 동일한 수의 열을 예상하고 첫 번째 열만 쉼표를 포함 할 수 있으면 처음에는 아무것도 읽지 않고 초과 한 열을 연결하십시오.

문제는 인터페이스가 모호하므로이 문제를 피할 수는 있지만 더 나은 해결 방법은 인터페이스를 고정 시키려고하는 것입니다 (여러 패치를 만드는 것보다 어렵습니다 ...).

0

나는 맥주에 동의합니다. 그건 심하게 형성된 csv 파일입니다.가장 좋은 방법은 다른 구분 기호를 찾거나 쉼표 나 따옴표를 오버로드를 중지하는 것입니다/당신이 역의 각 줄을 읽고 싶은 이유를 충분히 이해하지 못하는 쉼표

4

분리되지 않은 필드를 탈출하지만, 당신이 할 수 있습니다 :

import csv 
file = open("mycsvfile.csv") 
reversedLines = [line[::-1] for line in file] 
file.close() 
reader = csv.reader(reversedLines) 
for backwardRow in reader: 
    lastField = backwardRow[0][::-1] 
    secondField = backwardRow[1][::-1] 
+0

잘 작동했습니다. D thanks – dassouki

관련 문제