CSV는 "쉼표로 구분된 값"을 나타냅니다.
쉼표로 구분된 값이 있는 행으로 구성된 일반적인 데이터 형식입니다. 데이터 내보내기 및 가져오기에 사용됩니다.
예를 들어 :
Gmail 연락처를 CSV 파일로 내보낼 수 있으며 동일한 형식을 사용하여 가져올 수도 있습니다.
CSV 파일의 모양 :
id,name 1,chocolate 2,bacon 3,apple 4,banana 5,almonds
이제 Ruby CSV 라이브러리를 사용하는 방법을 배우게 됩니다. CSV 파일을 읽고 쓸 수 있습니다.
루비 CSV 파싱
Ruby에는 CSV 라이브러리가 내장되어 있습니다.
파일을 직접 읽을 수 있음 :
require 'csv' CSV.read("favorite_foods.csv")
또는 CSV 데이터로 문자열을 구문 분석할 수 있습니다. :
require 'csv' CSV.parse("1,chocolate\n2,bacon\n3,apple")
결과는?
모든 항목이 테이블의 한 행인 2차원 배열을 얻습니다.
이렇게 생겼어요 :
[ ["id", "name"], ["1", "chocolate"], ["2", "bacon"], ["3", "apple"], ["4", "banana"], ["5", "almonds"] ]
data[1][1]
와 같은 배열 인덱스를 사용할 수 있습니다. 이 데이터로 작업합니다.
하지만 더 좋은 방법이 있습니다!
CSV 옵션
파일에 헤더가 있는 경우 CSV 파서에 헤더를 사용하도록 지시할 수 있습니다.
좋아요 :
table = CSV.parse(File.read("cats.csv"), headers: true)
이제 다차원 배열 대신 CSV 테이블 개체를 얻습니다.
설명입니다 :
<블록 인용>
“CSV::Table
CSV 문서를 나타내는 2차원 데이터 구조입니다. 테이블을 사용하면 행 또는 열별로 데이터를 작업하고, 데이터를 조작하고, 결과를 다시 CSV로 변환할 수도 있습니다.”
이 테이블 중 하나가 주어지면 모든 행에서 필요한 데이터를 얻을 수 있습니다.
예 :
table[0]["id"] # "1" table[0]["name"] # "chocolate"
여기 0
첫 번째 행, id
&name
열 이름입니다.
두 가지 테이블 모드가 있습니다. :
- by_col
- 행별
테이블 모드(row
기본) 다른 각도에서 데이터를 볼 수 있습니다.
예를 들어 :
table.by_col[0] # ["1", "2", "3", "4", "5"] table.by_col[1] # ["chocolate", "bacon", "apple", "banana", "almonds"]
여기 0
첫 번째 열, 1
두 번째 열입니다.
이 두 가지 방법은 테이블 사본을 반환합니다. .
원본 테이블을 변경하려면 by_col!
를 사용할 수 있습니다. &by_row!
방법.
테이블의 복사본이 생성되지 않기 때문에 메모리 효율성이 더 높아집니다.
CSV 변환기 사용 방법
id
가 있다는 것을 눈치채셨을 것입니다. 열을 문자열 배열로.
정수가 필요하면 어떻게 합니까?
to_i
를 호출하면 얻을 수 있습니다. 각 문자열에...
하지만 지름길이 있습니다!
Ruby CSV 라이브러리는 변환기라는 것을 구현합니다. .
변환기가 자동으로 값을 변환합니다.
예를 들어 :
CSV.parse("1,2,3,4,5") # [["1", "2", "3", "4", "5"]] CSV.parse("1,2,3,4,5", converters: :numeric) # [[1, 2, 3, 4, 5]]
6개의 내장 변환기가 있습니다. :
- 정수
- 플로트
- 숫자(Float + 정수)
- 날짜
- 날짜/시간
- 전체
하지만 사용자 지정 변환기를 만들 수도 있습니다.
방법은 다음과 같습니다. :
CSV::Converters[:symbol] = ->(value) { value.to_sym rescue value }
이와 같이 새 변환기를 사용할 수 있습니다. :
CSV.parse("a,b,c", headers: false, converters: :symbol) # [[:a, :b, :c]]
새 CSV 파일을 만드는 방법
CSV 파일을 다양한 방식으로 구문 분석하고 읽을 수 있을 뿐만 아니라 처음부터 CSV를 생성할 수도 있습니다.
쉬운 방법입니다 :
cats = [ [:blue, 1], [:white, 2], [:black_and_white, 3] ] cats.map { |c| c.join(",") }.join("\n")
generate
을 사용할 수도 있습니다. 방법:
CSV.generate do |csv| csv << [:blue, 1] csv << [:white, 2] csv << [:black_and_white, 3] end
이렇게 하면 데이터가 올바른 형식으로 준비됩니다.
파일에 쓰려면 File.write("cats.csv", data)
와 같은 것을 사용해야 합니다. 또는 generate
대신 open
를 사용할 수 있습니다. 파일 이름 및 쓰기 모드가 활성화되어 있습니다.
좋아요 :
CSV.open("cats.csv", "w") do |csv| csv << [:white, 2] end
이제 새 CSV 파일이 생겼습니다!
CSV 보석 및 성능
내장 라이브러리는 괜찮고 작업을 완료할 것입니다.
그러나 다른 기능을 가진 몇 가지 CSV 구문 분석 보석도 찾을 수 있습니다.
예를 들어, smarter_csv
gem은 CSV 데이터를 해시 배열로 변환합니다.
예 :
require 'smarter_csv' IntegerConverter = Object.new def IntegerConverter.convert(value) Integer(value) end SmarterCSV.process('testing.csv', value_converters: { id: IntegerConverter }) # [{:id=>1, :name=>"a"}, {:id=>2, :name=>"b"}, {:id=>3, :name=>"c"}]
성능 비교 :
Comparison: CSV: 112.9 i/s Smarter CSV: 21.7 i/s - 5.21x slower Tabular: 17.3 i/s - 6.52x slower
요약
Ruby에서 CSV 파일을 읽고 쓰는 방법을 배웠습니다! CSV 데이터를 처리하기 위한 변환기 및 대체 Ruby gem에 대해서도 배웠습니다.
큰 CSV 파일을 처리하려는 경우 (> 10MB) CSV.foreach(file_name)
블록을 사용하는 방법. 이렇게 하면 한 번에 한 행을 읽고 훨씬 적은 메모리를 사용합니다.
더 많은 사람들이 찾을 수 있도록 이 글을 공유해주세요!