質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

3349閲覧

ruby csv読み込み時に、ヘッダー情報を取得するには

taro373

総合スコア189

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/11/05 07:01

編集2018/11/05 07:27

rubyでCSV.foreachを使いました。

CSV.foreach(ARGV[0], headers: true) do |row| # ヘッダ行以外の処理 end

処理した結果を再度csvとして出力したいのですが、その際の
ヘッダは入力ファイルと同じものを出力します。

"headers: true"を書いていると、ループの中はヘッダは
読み込まれず便利ですが、出力の際にはヘッダ情報を追加したい
となると、どうしたら良いのでしょうか。

"headers: true"を書かずに、1行目はヘッダとして保存して
出力処理で使う、というのが通常の使い方でしょうか。

それで目的は達成できますが、せっかくのヘッダを判定する機能が
生かされていないように思えて質問しました。

ヘッダ項目をソースに書いておき、出力時に最初に書き出せばOKですが
ファイルが変わる都度プログラムを書き換えなければならず、
汎用性がなくなると思いました。

CSV.tableを使うことも考えましたが、ヘッダに日本語が含まれているため、
(日本語のヘッダは、取得できないため)この方法は使えませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

CSV.openを使い、readline をまず1回行いヘッダー情報として保存することで
目的の動作を実現しました。

require 'csv' rows = {} csvf = CSV.open(ARGV[0],col_sep: "\t") header = csvf.readline # 1行目を読み込みヘッダー情報として保存 csvf.each do |row| rows[row[0]] = row if !rows.key?(row[0]) # 1カラム目が同じであれば重複として除外 end CSV.open('new.csv','w') do |newcsv| newcsv << header rows.each_value do |row| newcsv << row end end

投稿2018/11/06 05:49

taro373

総合スコア189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

rb

1csv = CSV.open(ARGV[0], headers: true) 2data = csv.map{|row| row} 3puts CSV.generate(write_headers: true, headers: csv.headers){|o| 4 data.each{|row| o << row} 5} 6# 気にしないでもいいと思うけどとりあえずclose 7csv.close

data[0].headersでも取れる事は取れます。

投稿2018/11/05 07:29

編集2018/11/06 06:09
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro373

2018/11/05 07:58

すみません、タイミングがちょっと遅かったです。 今回のファイルは1つだけですがヘッダーに日本語が入っています。 CSV.tableでは値が取得できませんでした。 csv.closeは不要?でしょうか。下記のエラーになりました undefined method `close' for #<CSV::Table mode .......
asm

2018/11/05 08:09

> CSV.tableでは値が取得できませんでした。 そうでしたか、ではopenですね CSV::Tableだとcloseないんですね まぁ、なくてもほぼ問題ないはず
guest

0

SmarterCSV をつかうという案もあります。

1.csv

"英語","日本語" "Hello, World!","こんにちは、世界!" "Good by!","さようなら"

c.rb

ruby

1require 'smarter_csv' 2require 'csv' 3 4data = SmarterCSV.process('1.csv') 5p data 6data[1][:日本語] = "さらばじゃ" 7 8CSV.open('2.csv', 'w',:headers => data.first.keys, :write_headers => true) do |file| 9 data.each {|row| file << row} 10end

実行例
イメージ説明

参考情報

  • CSV.table では日本語のヘッダは表示されない

https://obel.hatenablog.jp/entry/20170626/1498466804

  • Ruby で CSV を扱う際に便利な gem である SmarterCSV

https://obel.hatenablog.jp/entry/20180211/1518311830

投稿2018/11/09 13:35

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問