2014-10-16 2 views
1
#!/usr/bin/env ruby 
require 'rubygems' 
require 'json' 
require 'csv' 
def is_int(str) 
return !!(str =~ /^[-+]?[1-9]([0-9]*)?$/) 
end 

lines = CSV.open(ARGV[0],{:col_sep => "\|"}).readlines 
keys = lines.delete lines.first 

File.open(ARGV[1], "w") do |f| 
data = lines.map do |values| 
is_int(values) ? values.to_i : values.to_s 
Hash[keys.zip(values)] 
end 
f.puts JSON.pretty_generate(data) 
end 

CSV 파일을 구문 분석하고 JSON 형식으로 두 번째 파일을 인쇄하기위한 Ruby 스크립트가 있습니다. (즉, 헤더가 처음이다 excepts) 회선에서
을 - - CSV 파일
읽기 - 정말 루비와 잘하지만, ID하지CSV를 JSON으로 변환하기위한 Ruby 스크립트


에 대한 수정 싶어하는 file.json을 만드는 곳
CSV 파일 :

ID|NAME|SURNAME|TELEPHONE 
01|Jhon|Smith|123456 
02|Steve|Brown|654321 
파일의 이름은 예를 들면 선

번째 필드

파일 jhon.json의 출력 :

[ 
    { 
    "ID": "01", 
    "NAME": "Jhon", 
    "SURNAME": "Smith", 
    "TELEPHONE": "123456", 
    }, 
] 

누군가가 나를 도울 수 있습니까?

+0

다음은 CSV [읽기 및 구문 분석] (http://www.sitepoint.com/guide-ruby-csv-library-part)을 이해하는 좋은 출발점입니다. –

+2

CSV 라이브러리에는 기본 제공 [변환기] (http://ruby-doc.org/stdlib-2.1.3/libdoc/csv/rdoc/CSV.html#Converters)가 있습니다. – Stefan

답변

1

당신은 솔루션에 가까운, 그러나의 조금를 다시 포맷하고 여기에

lines = CSV.open(ARGV[0],{:col_sep => "\|"}).readlines 
# remove first entry of the lines array 
keys = lines.shift 

lines.each do |values| 
    # convert the line into a hash and transform string into int 
    hash=Hash[keys.zip(values.map{|val| is_int(val) ? val.to_i : val}) ] 

    # Write a file with the hash results 
    File.open("#{hash['NAME']}.json", "w") do |f| 
     f.write JSON.pretty_generate [hash] 
    end 
end 

당신이 tomsoft의 솔루션이 좋아 보이는

+0

정말 고마워! –

+1

블록을'File.open'에 전달할 때 명시 적으로 파일을 닫을 필요는 없습니다. – Stefan

+0

작성, 수정 중입니다. – tomsoft

0

저장하는 각 라인에 대한 새 파일을 엽니 다 간편화 할 수 있지만, 여기에 광산은 어쨌든 :

output = [] 
lines = CSV.open(ARGV[0],{:col_sep => "\|"}).readlines 
headers = lines.shift 
lines.each_with_index.map do |line, index| 
    output << Hash[*line.each_with_index.map {|col, index| [headers[index],is_int(col) ? col.to_i : col]}.flatten] 
end 
File.open(ARGV[1], "w") do |f| 
    f << output 
end 
+0

감사합니다. –

2

csv로 라이브러리가 당신을 위해 처리의 대부분을 처리 할 수 ​​

require 'csv' 
require 'json' 

options = { col_sep: '|', converters: :numeric, headers: true } 

CSV.foreach(ARGV[0], options) do |row| 
    filename = "#{row['NAME'].downcase}.json" 
    File.open(filename, 'w') { |f| f << JSON.pretty_generate(row.to_hash) } 
end 

을 전달하면 converters: :numeric은 숫자 필드를 숫자 유형 (IntegerFloat)으로 변환합니다.

headers: true 옵션을 사용하면 이름 (예 : row['NAME'])으로 필드에 액세스하고 행을 해시로 변환 할 수 있습니다.

+0

화려한 솔루션, 감사합니다! –

+0

위대한, 나는이 옵션들조차 몰랐다. – tomsoft

관련 문제