한 열에 다른 데이터가있는 Ruby에서 CSV 파일의 일부 열 사본을 만들려면 어떻게해야합니까?


84

"A.csv"라는 CSV 파일이 있습니다. "A.csv"의 데이터로 "B.csv"라는 새 CSV 파일을 생성해야합니다.

"A.csv"의 열 하위 집합을 사용하고 한 열의 값을 "B.csv"의 새 값으로 업데이트해야합니다. 궁극적으로 B.csv의이 데이터를 사용하여 데이터베이스에 대해 유효성을 검사합니다.

  1. 새 CSV 파일은 어떻게 만듭니 까?
  2. 필수 열의 데이터를 A.csv에서 "B.csv"로 복사하려면 어떻게해야합니까?
  3. 특정 열의 값을 어떻게 추가합니까?

Ruby를 처음 사용하지만 CSV를 읽고 배열이나 해시를 가져올 수 있습니다.


2
이것은 문제 해결을위한 귀하의 노력을 보여주는 것과 같은 기본 정보가 부족합니다. 이 정보는 CSV 문서에 있습니다. " How to Ask "및 " 최소한의 재현 가능한 예제 " 읽으십시오 .
The Tin Man

의 가능한 중복 루비 CSV로 출력 배열
phunehehe

답변:


191

mikeb가 지적한 바와 같이, 워드 프로세서가있다 - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html - 아니면 (모든 테스트 아래의 예와 함께 따라 할 수 있고 일):

새 파일을 생성하려면 :

이 파일에는 헤더 행과 데이터 행, 매우 간단한 CSV의 두 행이 있습니다.

require "csv"
CSV.open("file.csv", "wb") do |csv|
  csv << ["animal", "count", "price"]
  csv << ["fox", "1", "$90.00"]
end

그 결과 다음과 같은 "file.csv"라는 파일이 생성됩니다.

animal,count,price
fox,1,$90.00

CSV에 데이터를 추가하는 방법

"wb"모드를 사용하는 대신 위와 거의 동일한 공식으로 "a +"모드를 사용합니다. 이에 대한 자세한 내용은 다음 스택 오버플로 답변을 참조하십시오 . Ruby File.open 모드 및 옵션은 무엇입니까?

CSV.open("file.csv", "a+") do |csv|
  csv << ["cow", "3","2500"]
end

이제 file.csv를 열면 다음과 같이됩니다.

animal,count,price
fox,1,$90.00
cow,3,2500

CSV 파일에서 읽기

이제 파일 복사 및 쓰기, CSV 읽기 및 조작을 위해 데이터를 가져 오는 방법을 알았습니다.

CSV.foreach("file.csv") do |row|
  puts row #first row would be ["animal", "count", "price"] - etc.
end

물론 이것은이 gem을 사용하여 CSV에서 정보를 가져올 수있는 수백 가지 방법 중 하나와 같습니다. 더 많은 정보를 원하시면 입문서가 있으니 지금 문서를 방문하시기 바랍니다 : http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


바로 쓰지 않고 열려면 어떻게해야합니까? 블록을 사용하지 않습니까?
Donato

복사 및 붙여 넣기가 가능한 코드에 감사드립니다! -쓰기에는 너무 게으르다
DominikAngerer

여기에는 새 CSV 생성이 포함되지만 사용 가능한 열의 하위 집합을 복사하고 해당 값을 변경하거나 추가하라는 요청을 처리하는 대신 전체 행을 추가하고 읽는 방법에 대한 정보로 이동합니다. 나는 OP와 동일한 종류의 프로젝트를 가지고 있으며 문서 또는이 답변의 도움을받지 못 했으므로 여기로 돌아와서 더 구체적인 답변을 제공 할 수 있기를 바랍니다.
Tyler James Young

3

Ruby의 CSV 수업을 보셨습니까? 꽤 포괄적 인 것 같습니다. 여기에서 확인하세요 : http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


1
링크 주셔서 감사합니다. 나는 그것을 참조 할 것입니다. Ruby를 통해 csv 파일을 편집 할 수 있습니까? csv에서 열 값을 업데이트 할 수 있습니까? 나중에 필요한 열의 해시 만 얻습니까?
user1718712

0

당신은 아마 사용하기를 원할 것입니다 CSV::parse그것이하는 데이터의 테이블로 당신의 CSV를 이해하는 데 도움이 루비와 헤더 값에 쉽게 액세스 할 수 있습니다.

안타깝게도 메서드 CSV::parse 대한 사용 가능한 문서 는이 목적을 위해 실제로 사용하는 방법을 명확하지 않습니다.

비슷한 작업이 있었고 rubyguides.com의 Ruby로 CSV 파일을 읽고 구문 분석하는 방법 이 CSV 클래스 문서 나 여기에서 가리키는 답변보다 훨씬 더 많은 도움 을 받았습니다.

그 페이지 전체를 읽는 것이 좋습니다. 중요한 부분은 다음을 CSV::Table사용하여 주어진 CSV를 객체 로 변환하는 것입니다 .

table = CSV.parse(File.read("cats.csv"), headers: true)

이제 클래스 에 대한 문서가CSV::Table 있지만 rubyguides.com 페이지의 명확한 예제를 통해 더 많은 도움을받을 수 있습니다. 내가 강조 할 한 가지는 .parse헤더를 예상 할 때 결과 테이블이 데이터의 첫 번째 행을 row로 취급한다는 것 [0]입니다.

특히 .by_colTable개체에 사용할 수 있는 방법에 관심이있을 것입니다 . 이렇게하면 입력 및 / 또는 출력에서 ​​다른 열 인덱스 위치를 반복하고 한 위치에서 다른 위치로 복사하거나 새 값을 출력에 추가 할 수 있습니다. 작동하게되면 다시 돌아와서 예제를 게시하겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.