23

CSVファイルを解析しようとしましたが、それでもエラーメッセージが表示されます引用符で囲まれていないフィールドでは、\rまたは\nは許可されません(2行目)。

私はここで非常に似たトピックを見つけました。ここで、次のことを行うためのヒントがありました。

  CSV.open('file.csv', :row_sep => "\r\n") do |csv|

しかし、残念ながら彼は私を動かしません...私はCSVファイルを変更できないので、コードでそれを修正する必要があります。

CSVファイルのサンプルを編集:

A;B;C
1234;...

それを行う方法はありますか?

どうもありがとう!

4

9 に答える 9

17

まず、列区切り文字を「;」に設定する必要があります。これは、CSVファイルが解析される通常の方法ではないためです。これは私のために働いた:

CSV.open('file.csv', :row_sep => :auto, :col_sep => ";") do |csv|
    csv.each { |a,b,c| puts "#{a},#{b},#{c}" } 
end

1.9.2 CSVドキュメントから:

\r\n自動検出は、データを先読みして、次、、、 \nまたは\rシーケンスを探します。引用符で囲まれたフィールドにある場合でも、同じ行末があると仮定して、シーケンスが選択されます。

于 2012-07-18T19:42:28.837 に答える
15

奇妙なフォーマット(Excelやスプレッドシートなど)を使用した可能性のあるプログラムによってCSVが変更または保存された場合の、より簡単な解決策:

  1. プレーンテキストエディタでファイルを開きます(私はSublime Text 3を使用しました)
  2. Enterキーを押して、任意の場所に新しい行を追加します
  3. ファイルを保存します
  4. 追加した行を削除します
  5. ファイルをもう一度保存します
  6. インポートを再試行してください。エラーはなくなります。
于 2015-09-10T22:57:15.917 に答える
3

私の場合、LinkedIn CSVをインポートしていて、エラーが発生しました。

私は次のように空白行を削除しました:

  def import
    csv_text = File.read('filepath', :encoding => 'ISO-8859-1')
    #remove blank lines from LinkedIn
    csv_text = csv_text.gsub /^$\n/, ''
    @csv = CSV.parse(csv_text, :headers => true, skip_blanks: true)
  end
于 2016-06-17T10:29:42.413 に答える
2

私の場合、エンコーディングと、データで発生しないことが保証されている引用文字を提供する必要がありました

CSV.read("file.txt", 'rb:bom|UTF-16LE', {:row_sep => "\r\n", :col_sep => "\t", :quote_char => "\x00"})
于 2016-01-26T17:28:23.707 に答える
1

これは古い投稿だと思いますが、最近、標準のRubyCSVライブラリで解析できない不適切な形式のCSVファイルで同様の問題が発生しました。

すぐにファイルを解析するSmarterCSVgemを試しました。これは外部ライブラリであるため、すべての人にとって最善の解決策ではないかもしれませんが、自分でファイルを解析するよりも優れています。

opts = { col_sep: ';', file_encoding: 'iso-8859-1', skip_lines: 5 }
SmarterCSV.process(file, opts).each do |row|
  p row[:someheader]
end
于 2018-10-25T21:04:54.330 に答える
1

このスレッドを参照してください引用符で囲まれていないフィールドは\rまたは\nを許可しません

解決:

file = open(file.csv).read.gsub!("\r", '')
CSV.open(file, :row_sep => "\r\n") do |csv|
于 2021-08-30T08:38:35.687 に答える
0

私の場合、スプレッドシート/ CSVの最初の行は、二重引用符で囲まれた紹介テキストでした。私が得たエラーは次のとおりです。フィールドは\rまたは\nを許可しません(1行目)。(CSV :: MalformedCSVError)

「文字」を含むコメントを削除したので、.csvには.csvデータのみが含まれ、保存され、プログラムはエラーなしで動作しました。

于 2016-10-27T20:34:03.157 に答える
0

セルに改行を含むExcelからのファイルを処理する必要がある場合は、解決策もあります。

この方法の大きな欠点は、文字列にセミコロンや二重引用符を使用できないことです。

私はセミコロンなしで行くことを選びます

if file.respond_to?(:read)
  csv_contents = file.read
elsif file_data.respond_to?(:path)
  csv_contents = File.read(file.path)
else
  logger.error "Bad file_data: #{file_data.class.name}: #{file_data.inspect}"
  return false
end

result = "string"
csv_contents = csv_contents.force_encoding("iso-8859-1").encode('utf-8') # In my case the files are latin 1...

# Here is the important part (Remove all newlines between quotes):
while !result.nil?
  result = csv_contents.sub!(/(\"[^\;]*)[\n\r]([^\;]*\")/){$1 + ", " + $2}
end

CSV.parse(csv_contents, headers: false, :row_sep => :auto, col_sep: ";") do |row|
  # do whatever
end

私の場合、ソリューションは正常に機能します。大きなファイルを処理すると、問題が発生する可能性があります。

引用符なしで使用したい場合は、正規表現のセミコロンを引用符に置き換えてください。

于 2017-02-08T10:25:17.683 に答える
-4

Excelによって引き起こされる奇妙なフォーマットを修正する別の簡単な解決策は、データをコピーしてGoogleスプレッドシートに貼り付け、CSVとしてダウンロードすることです。

于 2016-02-12T03:13:07.550 に答える