루비의 CSV로 배열 출력
Ruby를 사용하여 CSV 파일을 어레이로 읽을 수 있을 정도로 쉽지만 어레이를 CSV 파일로 쓰는 방법에 대한 좋은 문서를 찾을 수 없습니다.누가 이걸 어떻게 하는지 알려줄 수 있나요?
문제가 된다면 루비 1.9.2를 사용합니다.
파일로:
require 'csv'
CSV.open("myfile.csv", "w") do |csv|
csv << ["row", "of", "CSV", "data"]
csv << ["another", "row"]
# ...
end
문자열로:
require 'csv'
csv_string = CSV.generate do |csv|
csv << ["row", "of", "CSV", "data"]
csv << ["another", "row"]
# ...
end
CSV에 대한 최신 문서는 다음과 같습니다. http://ruby-doc.org/stdlib/libdoc/csv/rdoc/index.html
데이터 배열이 있는 경우:
rows = [["a1", "a2", "a3"],["b1", "b2", "b3", "b4"], ["c1", "c2", "c3"]]
그런 다음 파일에 다음과 같이 기록할 수 있습니다. 훨씬 더 간단합니다.
require "csv"
File.write("ss.csv", rows.map(&:to_csv).join)
저는 이것을 단 한 줄로 요약했습니다.
rows = [['a1', 'a2', 'a3'],['b1', 'b2', 'b3', 'b4'], ['c1', 'c2', 'c3'], ... ]
csv_str = rows.inject([]) { |csv, row| csv << CSV.generate_line(row) }.join("")
#=> "a1,a2,a3\nb1,b2,b3\nc1,c2,c3\n"
위의 모든 작업을 수행하고 CSV에 한 줄로 저장합니다.
File.open("ss.csv", "w") {|f| f.write(rows.inject([]) { |csv, row| csv << CSV.generate_line(row) }.join(""))}
참고:
활성 레코드 데이터베이스를 CSV로 변환하는 것은 이런 것이라고 생각합니다.
CSV.open(fn, 'w') do |csv|
csv << Model.column_names
Model.where(query).each do |m|
csv << m.attributes.values
end
end
흠 @tamouse, 그 요지는 csv 소스를 읽지 않고는 다소 혼란스럽지만, 일반적으로 어레이의 각 해시가 동일한 k/v 쌍의 수와 키가 항상 동일한 순서(즉, 데이터가 구조화된 경우)로 있다고 가정하면 다음과 같은 작업을 수행할 수 있습니다.
rowid = 0
CSV.open(fn, 'w') do |csv|
hsh_ary.each do |hsh|
rowid += 1
if rowid == 1
csv << hsh.keys# adding header row (column labels)
else
csv << hsh.values
end# of if/else inside hsh
end# of hsh's (rows)
end# of csv open
데이터가 구조화되지 않은 경우에는 작동하지 않습니다.
관심 있는 사람이 있으면 다음과 같이 한 줄로 설명합니다(및 CSV의 유형 정보 손실에 대한 참고 사항).
require 'csv'
rows = [[1,2,3],[4,5]] # [[1, 2, 3], [4, 5]]
# To CSV string
csv = rows.map(&:to_csv).join # "1,2,3\n4,5\n"
# ... and back, as String[][]
rows2 = csv.split("\n").map(&:parse_csv) # [["1", "2", "3"], ["4", "5"]]
# File I/O:
filename = '/tmp/vsc.csv'
# Save to file -- answer to your question
IO.write(filename, rows.map(&:to_csv).join)
# Read from file
# rows3 = IO.read(filename).split("\n").map(&:parse_csv)
rows3 = CSV.read(filename)
rows3 == rows2 # true
rows3 == rows # false
참고: CSV는 모든 유형 정보를 손실합니다. JSON을 사용하여 기본 유형 정보를 보존하거나 상세(그러나 보다 쉽게 사람이 편집할 수 있는) YAML로 이동하여 모든 유형 정보를 보존할 수 있습니다. 예를 들어, 날짜 유형이 필요한 경우 CSV 및 JSON의 문자열이 됩니다.
@boulder_roby의 대답을 바탕으로, 이것이 제가 찾고 있는 것입니다.us_eco
에는 개요에 나와 있는 CSV 테이블이 포함되어 있습니다.
CSV.open('outfile.txt','wb', col_sep: "\t") do |csvfile|
csvfile << us_eco.first.keys
us_eco.each do |row|
csvfile << row.values
end
end
https://gist.github.com/tamouse/4647196 에서 요지 업데이트
내 자신이 이것과 씨름하고 있습니다.제 생각은 이렇습니다.
https://gist.github.com/2639448 :
require 'csv'
class CSV
def CSV.unparse array
CSV.generate do |csv|
array.each { |i| csv << i }
end
end
end
CSV.unparse [ %w(your array), %w(goes here) ]
언급URL : https://stackoverflow.com/questions/4822422/output-array-to-csv-in-ruby
'programing' 카테고리의 다른 글
C#에서 문자열을 다른 문자열로 분할 (0) | 2023.06.01 |
---|---|
CSS를 사용하여 HTML 입력의 자리 표시자 색 변경 (0) | 2023.06.01 |
CSS 디스플레이 속성의 전환 (0) | 2023.06.01 |
NSInteger를 NSString 데이터 유형으로 변환하려면 어떻게 해야 합니까? (0) | 2023.06.01 |
터미널에서 swift를 사용하려면 어떻게 해야 합니까? (0) | 2023.05.27 |