2011-10-20 2 views
4

내 Rails3 앱이 사용자가 업로드 한 CSV 파일을 구문 분석합니다.
예상대로 사용자는 탭으로 구분 된 쉼표로 구분 된 파일을 업로드합니다.
둘 다 지원하고 싶습니다.FasterCSV : 여러 구분 기호

내 코드 :

input = CSV.read(uploaded_io.tempfile, { encoding: "UTF-8", :col_sep => "\t"}) 

질문 : 방법도 쉼표를 지원하기 위해 변경하는?

FasterCSV의 문서에 col_sep이 The String placed between each field.으로 표시되어 있으므로 :col_sep => ",\t"이 작동하지 않습니다.

참고 : 내부에있는 모든 데이터는 정수 또는 식별자이므로 콘텐츠 내에 (구분 기호가 아닌) \t 또는 ,을 사용할 확률은 0입니다. 따라서 동일한 파일에서 두 개의 서로 다른 구분 기호를 사용하는 것은 내가 명시 적으로 방지하고 싶은 것이 아닙니다.

답변

3

해결 방법 1 :

CSV.read() 호출에서 그 값을은 사용자들이 자신의 CSV 파일에서 사용할 분리기 드롭 다운으로 선택할 수 있도록하는 것입니다, 다음 방금 설정하는 한 가지 간단한 방법 . 하지만 자동으로하고 싶습니다. :-)

해결 방법 2 :

당신은 읽기에서 할 수있는 CSV의 첫 번째 줄에 정규 File.read()와 파일 및 /,/에 대한 첫 번째 라인을 일치시켜 그것을 분석하고 /\t/에 대해 ...에 따라 RegExp가 일치하는 경우 일치하는 (단일) 구분 기호로 CSV.read() 호출에서 구분 기호를 선택합니다. 그런 다음 CSV.read(..., :col_sep => single_separator) 파일을 읽습니다.

그러나주의 : 처음에는

는 모두 허용하는 메서드 호출에 구분자로 ",\t"을 사용하고자하는 좋은 우아한 보이는 -하지만 가능한 불쾌한 버그를 소개하는 것이를주의하십시오!

우연히 또는 우연히 CVS 파일에 탭과 쉼표가 모두 포함되는 경우 ... 어떻게 하시겠습니까? 둘 다 분리 하시겠습니까? 어떻게 확신 할 수 있니? 나는 CSV 구분 일반 CSV 파일에 다음과 같이 "혼합"가 표시되지 않기 때문에 즉, 실수있을 거라고 생각 - 항상 당신이 ",\t" 사용하지한다고 생각 하나 ',' 정도

"\t"이다 -의 원인이 될 수있는 큰 문제가 발생했으며, 그 이유가 col_sep 옵션이 RegExp를 허용하거나 구현하지 않았기 때문일 수 있습니다.

+0

내가 추가 한 메모를 참조하십시오. –

+0

OK, understand .. 그것은 Solution 2가 훌륭하게 작동해야 함을 의미합니다.:) – Tilo

+0

+1 예, 유효한 해결책입니다. 감사합니다! 수락하기 전에 하루 정도 기다려야 할 것입니다. 어쩌면 누군가가 이것을 잊어 버린 FasterCSV 옵션을 알고 있습니다 .--) –

0

데이터에 이스케이프 따옴표 등이 없으면 정규식으로 분할하면됩니다.

f = File.new("some_file.csv") 
res = f.readlines.map{|line| line.chomp.split(/[\t,]/)} 
f.close 
0

잔인한 솔루션 : 당신이 언급 문제는 이해할 수 있지만, 여기에 적용되지 않습니다

require 'csv' 
csv= CSV.new("some_file") 
csv.instance_variable_set(:@col_sep, /[\t,]/)