web-dev-qa-db-ja.com

read_csv()エラーメッセージの解析、解釈方法は?

大量のcsvデータを解析している最中です。 read_csv()の問題を引き起こす、一貫性のない区切り文字、偽の文字、および形式の問題があるという点で、データはかなり「ダーティ」です。

ただし、ここでの私の問題は、データの汚れではなく、read_csv()によって発生する解析エラーを理解しようとすることです。エラーメッセージをよりよく理解できれば、スクリプトの問題を修正するために管理作業を行うことができます。 データのサイズにより、手動によるアプローチが困難になります。

これが最小限の例です。次のようなcsvファイルがあるとします。

"col_a","col_b","col_c"
"1","a quick","10"
"2","a quick "brown" fox","20"
"3","quick, brown fox","30"

2行目の「茶色」の周りに誤った引用符があることに注意してください。このコンテンツは、「my_data.csv "」というファイルに入ります。

そのファイルを読み込もうとすると、解析に失敗することがあります。

> library(tidyverse)
> df <- read_csv("./my_data.csv", col_types = cols(.default = "c"))
Warning: 2 parsing failures.
row # A tibble: 2 x 5 col     row   col           expected actual            file expected   <int> <chr>              <chr>  <chr>           <chr> actual 1     2 col_b delimiter or quote      b './my_data.csv' file 2     2 col_b delimiter or quote        './my_data.csv'

ご覧のとおり、解析の失敗は「きれいに印刷」されていません。 271文字のONELONGLINEです。

失敗メッセージのどこに改行を入れて、問題がどこにあるのか、メッセージが何を伝えようとしているのかを確認することすらできません。また、「2x5ティブル」を指します。何のチブル?私のデータフレームは3x3です。

read_csv()からのメッセージをフォーマットまたは改行する方法を誰かに教えてもらえますか?

はい、私はこの特定の最小限の例で問題が何であるかを知っています。私の実際のデータでは、大量のcsv(〜100万行)を扱っており、何百もの解析エラーが発生する不整合がちりばめられています。これらを分類し、プログラムで処理するためのワークフローを設定したいと思います。最初のステップは、解析失敗メッセージを「解析」する方法を理解することだと思います。

10
Angelo

息を呑んで実際のドキュメントを見た後、 read_csv()から解析の失敗を取得する方法があると思います非常に使いやすいフォーム

解析の失敗を取得するために私がしなければならなかったのは、problems()を使用することだけでした。

> library(tidyverse)
> df <- read_csv("./my_data.csv", col_types = cols(.default = "c"))
Warning: 2 parsing failures.
row # A tibble: 2 x 5 col     row   col           expected actual            file expected   <int> <chr>              <chr>  <chr>           <chr> actual 1     2 col_b delimiter or quote      b './my_data.csv' file 2     2 col_b delimiter or quote        './my_data.csv'

> parsing_failures <- problems(df)
> parsing_failures
# A tibble: 2 x 5
    row   col           expected actual            file
  <int> <chr>              <chr>  <chr>           <chr>
1     2 col_b delimiter or quote      b './my_data.csv'
2     2 col_b delimiter or quote        './my_data.csv'

どうやらread_csv()は、解析の失敗の詳細を含むtibbleを関連付けており、これにはread_csvからproblems()

14
Angelo