Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby로 CSV 파일을 읽고 구문 분석하는 방법

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) 블록을 사용하는 방법. 이렇게 하면 한 번에 한 행을 읽고 훨씬 적은 메모리를 사용합니다.

더 많은 사람들이 찾을 수 있도록 이 글을 공유해주세요!