コンマ区切り値(CSV)ファイルを編集するための戦略


18

データ分析プロジェクトで作業するとき、データをコンマまたはタブ区切り(CSV、TSV)データファイルに保存することがよくあります。多くの場合、データは専用のデータベース管理システムに属します。私のアプリケーションの多くにとって、これはやり過ぎです。

Excel(またはおそらく別のスプレッドシートプログラム)でCSVファイルとTSVファイルを編集できます。これには利点があります。

  • スプレッドシートを使用すると、データを簡単に入力できます

また、いくつかの問題があります。

  • CSVファイルとTSVファイルを使用すると、さまざまな機能が失われたり、アクティブシートのみがどのように保存されるかなど、さまざまな警告メッセージが表示されます。したがって、ファイルを開いて少し変更したいだけの場合は迷惑です。
  • 多くの「おそらくインテリジェントな」変換を行います。たとえば、12/3と入力すると、日付を入力したいと考えられます。 更新:日付の例は、多くの例の1つにすぎないことを述べたはずです。ほとんどの問題は不適切な変換に関連しているようです。特に、数字や日付のように見えるテキストフィールドは問題を引き起こします。

または、標準のテキストエディターでテキストファイルを直接操作することもできます。これにより、入力した内容が記録されます。ただし、データを入力するのは非常に厄介な方法です(列が揃っていません。複数のセルに単純にデータを入力することは困難です。など)。

質問

  • CSVまたはTSVデータファイルを操作するための優れた戦略は何ですか?つまり、入力した内容が実際に正しく解釈されるようにしながら、データの入力と操作を簡単にする戦略は何ですか?

1
実際にファイルに対してどのような操作を行いますか?私の考えでは、それは受け入れられるオプションの範囲に劇的に影響します。また、ワードプロセッサで「スマート」変換を行わないように設定でき、プレーンテキストとして保存できる限り、ワードプロセッサでTSVデータを編集し、タブを並べて列を保持できるように思えます。 。
ウェイン

@ウェイン良い点。私はスプレッドシートプログラムで成長しているため、多くのショートカット(機能、コピーアンドペースト、余分な列の追加など)に精通しています。ここでは、データ分析についてではなく、単純な表形式のデータファイル(たとえば、Rコードの処理に必要なメタ情報)を作成するだけです。これらの基本的なテーブル操作はすべてRで実行できますが、私にとってはそれほど直感的ではありません。おそらく時間の経過とともに、Rでcsvを開き、いくつかの小さな変更を加えて再度保存することが、私の優先オプションになります。
ジェロミーアングリム

回答:


14
  1. Rに慣れている場合は、基本的なdata.frameを作成し、その上でfix()関数を使用してデータを入力できます。#5と同じ行に沿って、data.frameを設定したら、一連のreadLines(n = 1)(または何でも)を使用してデータを取得し、検証し、次を追加する機会を提供できます行。次に、修正をfix()のままにします。scan()を使用した以下の実装例を参照してください。

  2. Excelの別のオプションは面倒ですが、12/9を入力して、別の列に= IFERROR(MONTH(DateEntryCell)/ DAY(DataEntryCell)、DataEntryCell)を評価させることができます。しかし、その後、Excelシートとcsvシートを維持する必要があり、csvを記述する際の不満はすべて持続します。

  3. または、フィールドが比較的短く、長さが一定である限り、通常のテキストエディターはTSVで適切に機能します。完了したらいつでもExcelにロードして、各行の列数が予想どおりになるようにすることができます。
  4. Emacsは多くのプラットフォームで利用でき、おそらくhttp://www.emacswiki.org/emacs/CsvModeのような、これだけの何かを持っているでしょう。
  5. あなたが心のこもった魂である場合、データ入力を行うためにプログラミング言語で素早く何かをプログラミングするのは簡単です、データ編集ははるかに困難になります。
  6. グーグルで簡単に検索すると、この目的だけのソフトウェアが表示されますが、無料のソフトウェアは良いとは思えませんでした。
  7. 非常識に聞こえますが、スーパーユーザーの誰かがアクセス中のテーブルを編集し、CSVとしてエクスポートすることを提案しました。
  8. .csvとして保存する際に不満が出るのを止めることはできませんが、データ入力フィールドの前に単一のアポストロフィを入力することができ、自動フォーマットに関してはそのままにしておくことができます。素敵なことに、これは(少なくともOffice 2007では)csvファイルにアポストロフィを残しません。

更新: 私もこの問題を抱えているので、私はこの問題について多くのことをいじっていました。これまでのところ、これまで見てきたデータ入力のための最良/最も簡単なソリューションはKillinkCSVです。これは「無料」のソフトウェアではなく、30日間の試用期間とリーズナブルな価格(約27ドル)のシェアウェアです。ただし、既存のCSVを編集するためにどれだけ信頼できるかわかりません-非常に大きな(おそらく適切にフォーマットされた)CSVを渡したため、すべての行を読み取ることができませんでした。ただし、適度に大きいファイル(20 MB)ではうまく機能するようで、大きなファイルの問題は私の側のユーザーエラーかもしれません。

Rの例:

#This function takes a what argument like in scan, 
#a list with the types to be used, see usage example 
#at the end of this code block
#dataEntry will keep reading in values until 
#the values it reads in matches what is in 
#"terminateon".
#limitations: Many
dataEntry <- function(what,terminateon)
{
  CONTINUE <- TRUE #Make sure we start the loop
  data <- NULL #Create empty data so that the data.frame can define itself
  ti <- NULL
  while(CONTINUE)
  {
    ti <- NULL    
    ti <- tryCatch(
      {as.data.frame(scan(what=what, nlines=1, multi.line=FALSE, comment.char="",quiet=TRUE))},
      error=function (e) {print("Error in data entry! Line not stored.")
                          return(NULL)},
      warning=function(w) {print("Error in data entry! Line not stored.")
                           return(NULL)},
      finally={ti <- NULL}
    ) #Try getting the data according to the parameters in 'what' one row at a time.
    if (!is.null(ti))
    {
      if ((ncol(ti)==length(what)) & (nrow(ti)==1)) {
        data <- rbind(data,ti) #If there wasn't an error, add ti to the previous value  
      } else {
        print("Too many or not enough values on previous entry.")
        print("Tail of current data:")
        print(tail(data))
      }
    }
    if (!is.null(ti) & all(ti == terminateon)) 
    {
      CONTINUE <- FALSE
      data <- data[-c(nrow(data)),]
    } #if we've recieved the final value we won't continue and the last row is invalid so we remove it
  }
  return(data)
}

dataEntry(list(x=integer(), y=numeric(), z=character()),terminateon=c(999,999,"Z"))

ええ、Debian / Ubuntuのパッケージのcsv-mode.elおかげですでにインストール済みであることがemacs-goodies-elわかりました。
ダークエデルブエッテル

1
+1、ポイント1では、これまでに働いたすべての統計ソフトウェア(R、Stata、SPSS、SASを除く)がこのタイプの機能を提供します。だから、あなたのアドバイスは、誰かが使いたいソフトウェアに一般化しています。
アンディW

5

更新: [R-Helpからの大量のメールのバックログを処理していた]「The behavior ofread.csv()」のスレッドを思い出しました。この中で、ダンカン・マードックは、ジェロミーが言及しているいくつかの理由により、csvではなくData Interchange Format(DIF)ファイルを使用することを好むと述べています。私はこれを試しただけで、Gnumericは間違っています(日付として12/3を読み込む)が、OpenOffice.orgはこれを正しく読み取り、12/3の情報をそのまま保持します。(MS Excelでこれを確認したい人はいますか?)

DIFファイルはプレーンテキストであり、スプレッドシートで読み取ることができ、R(最新のRリビジョン(SVNリビジョン> = r53778)を使用している限り)はデータを正しい形式で読み取ります。


オリジナル:可能な限り、データの編集/操作にスプレッドシートのフルストップを使用しないようにします。既存のデータセットに加えた変更を文書化することは、不可能ではないにしても、信じられないほど困難です。せいぜい、スプレッドシートを使用して既存のデータをすばやく表示します。

データ処理では、生のcsvファイルを取得し、必要なすべての処理ステップを適用するRスクリプトを作成する傾向があります。私は、各段階で何をしているのか、そしてその理由を正確に説明するために、このスクリプトに頻繁にコメントしています。次に、データ分析スクリプトは、データをロードして処理するデータ処理スクリプトを呼び出します。

データ入力の場合、テキストエディターまたはスプレッドシートにデータを入力するのは面倒ですか?後者についてあなたが言及した問題は、CSVデータをテキストエディタに入力しようとする問題を上回るものではないと思います。

より良いスプレッドシートを試すことができます。OpenOffice.orgは、列を最初に「数値」としてフォーマットしても、12/3を日付としてフォーマットすることを停止します(または数値表現に変換します)。そのまま一方、Gnumericには、12月3日を残す場合は、あなたが最初に「数値」として列をフォーマットします。

OpenOffice.org 'は、エントリの先頭にa を追加することで、12/3を日付として再フォーマットしないように強制できます。つまり'12/3、スプレッドシートに12/3として表示され、テキストとして保存されます。これはおそらく非常に安全に使用できます。

12/3をテキストファイルに12/3として数値で保存する理由がわからない-Rのようなものはこれをどのように読むべきですか?

機能を失うことやアクティブなシートを保存することに関する警告についてのあなたのコメントは本当に問題ではありませんか?(もしそうなら、私の人生であなたの問題が欲しい;-)


再現性のある調査に関して、ファイル形式がCSVの場合、CSVファイルは、変更が行われたときにコミットして簡単にバージョン管理下に置くことができます。再現可能な研究にはこれで十分でしょうか?データ入力に関しては、効率を最大化するために、固定幅形式で生のデータ入力を行うか、他の人に取得させることがよくあります。ただし、CSVまたはTSVでデータを保存することを好みます(より透過的だと思います)。列を数値としてフォーマットすることに関して。この情報はおそらく保存時に失われます。
ジェロミーアングリム

12/3に関しては、12を3で割ったものを表す複数選択テストの例がありましたが、実例としてより多く使用します。大きなCSVファイルがある場合、1つの不適切な変換も必要ありません。警告に関しては、CSVファイルを1日に10回開くと、警告が退屈になります。また、実際にCSVファイルを保存したかどうかもわかりにくくなります。暴言でごめんなさい。
ジェロミーアングリム

@Jeromyはい、単一の変更(または単一のデータ処理ステップ)を行うことに厳しい場合は、すぐに保存してコミットします。スクリプトを使用してRで処理を行うことに関するメモを含めることは意図していません(これは私の優先言語であるため)。それが、同僚から送られてくるデータを扱う方法です。スプレッドシートをざっと見てから、csvをRに読み込んで、適用する必要のあるすべてのデータ処理手順を含むスクリプトを記述します。次に、そのスクリプトにコメントを付けて、自分が何をしたか、なぜそれをしたのかを記録し、元のデータファイルをまったく変更していません。
モニカの復活-G.シンプソン

@Jeromy:警告の公正なポイント。私は長い間、それらをノイズとしてフィルターで除去してきたので、彼らは私を悩ませません。GnumericとOpenOffice.orgをテストしたところ、12/3のcsvが日付に自動的に変換されます-それはゴミです!だからあなたの言うことはわかります。それを止める唯一の方法は、それらのデータをテキストとして保存し、ロード/インポート時にそのデータ型を強制することです。
モニカを回復-G.シンプソン

@Jeromy:re:数値の書式設定を失う-はい、インポート時に(OpenOffice.org)で "numeric"(Gnumeric)または "text"として列タイプを指定しない限り、そうなります。より良い変換を避けるために(私の編集した答えを参照)、テキストとして保存するかもしれない-あなたはまだ...インポート時にデータ型を指定する必要があります
復活モニカ- G.シンプソン

3

Googleリファイン(http://code.google.com/p/google-refine/)をご覧になることをお勧めします。CSVファイルを編集するには非常に良いツールだと思います


質問の戦略の要求にこれがどのように応答するか説明していただけますか?
whuber

3

CSVファイルとTSVファイルを一緒に使用することは避けます。代わりに、SQLを使用し、データのデータマートまたはデータベース(DB)コピーでのみ操作することを学習するか、データベースへのパススルー接続でSASまたはRを使用できます。そうすれば、Excel(または使用しているスプレッドシートプログラム)で恐ろしい検索と置換を行ったり、エラーが発生しやすいコピーと貼り付けを行う代わりに、データを一括更新できます。DBシステムを使用する利点は、ロギングが有効になり、エラーがあった場合に行った変更を迅速にロールバックでき、すべての変更を監査できることです。さらに、DBテーブルに整合性制約を設定して、不適切と思われる方法で変数/列を誤って更新または変更しないようにすることができます(たとえば、日付は日付のままで、他の情報は適切に型キャストされます)。勝った'

何らかの方法でデータ入力を容易にするためスプレッドシートが好きな場合は、データベースに付属のグラフィカルユーザーインターフェイスツール/ IDE(MicrosoftのManagement Studioなど)を使用するか、リンクバージョンを取り込むことで、これまで使用したすべてのデータベースで克服できますデータを入力し、データの制約を強制するために特別に設計されたシステムへのデータベースの統合(例:AccessのリンクテーブルフォームまたはカスタムWebインターフェイス)また、他のプログラムを使用して、両方の長所を活用してExcelでデータを更新し、それらの変更をデータベースに反映させることもできます(https://www.youtube.com/watch?v=5iyuF_mDSacを参照) 。


2

この質問をした後、CSVedを見始めました

ウェブサイトから:

CSVedは簡単で強力なCSVファイルエディターであり、任意の区切り文字で区切られた任意のCSVファイルを操作できます。

誰かがそれを経験したことがあるかどうかはわかりません。


インストールしてみました。簡単に試してみると、データ入力のゴミのように見えました。多分それをもっと長く試してみたら、それを効果的に使用する方法を見つけることができるだろうが、私はそうは思わない。
ラッセルピアス

質問の戦略の要求にこれがどのように応答するか説明していただけますか?
whuber

2

ExcelはCSVにあまり適していません。たとえば、Excelに「1,300」と入力し、それをコンマ区切り値として保存すると、次のことが可能になります。これは大きな問題になる可能性があります(他の人からファイルを受け取るときに定期的に遭遇します)。

私は個人的にOpenOffice.org Calcを使用し、上記のソリューションの多くも使用していますが、これらの多くは通常の編集に必要な機能と使いやすさを備えていません。OOO CalcはExcelよりもはるかにインテリジェントです。スプレッドシートプログラムなので、「12/3」ではなく「= 12/3」を入力する必要があります。そうでない場合は、計算ではなく値を入力します。

それを旋回させてください、あなたは失望することはありません。


1

Gnumericが好きな理由は、他の人ほど馬鹿にならないように(失われた機能については叫びません)、大きなデータで動作するからです...でも、Linux専用だと思います。


1
この質問に続いて、私は狩りをしました:Windowsバージョンprojects.gnome.org/gnumeric/downloads.shtmlがあります
ジェロミーアングリム

1
ただし、現在のシート(Jeromyのバグの1つ)のみを保存することについて警告し、インポート時に数値であると手動で指定しない限り、適切に保存された12/3の数値を日付に変換する迷惑な機能があります(データ>取得[外部データ]> [テキストファイルのインポート...]がロードされません。
モニカの復職-G.シンプソン

質問の戦略の要求にこれがどのように応答するか説明していただけますか?
whuber

1

Ron's Editorを使用してください。「ヘルプ」のないExcelと同じです。

サイトから:

Ron's Editorは、強力な表形式のテキスト(CSV)エディターです。標準のコンマおよびタブ区切りファイル(CSVおよびTSV)を含む、任意の形式の分離されたテキストを開くことができ、それらのコンテンツと構造を完全に制御できます。

表形式のテキストファイルを編集できるだけでなく、必要に応じて追加のビューに簡単にフィルターをかけて要約し、強力な分析機能を追加することもできます。

  • ライセンス:個人使用/評価は無料
  • 実行対象:Windows 32 / 64-bit 2000 / XP / 2003 / Vista /

質問の戦略の要求にこれがどのように応答するか説明していただけますか?
whuber

1

個人的には、「リレーショナルデータベース」のアイデアを使用してCSVファイルを管理したいと思っています。CSVファイルはデータの交換には適していますが、ビジネスロジックは含まれていません。CSVを使用した私の経験は、「​​ビジネスを繰り返し分析して分析を改善する」というものです。プレーンテキストファイル(CSV)のみを使用すると、多くの課題が生じます。たとえば、CSVファイルには「データを一意にするもの」、つまり「各行の主キー」は表示されません。他のデータソースを結合する必要がある場合、これは後で大きな問題を引き起こします。

SQLiteはCSVをリレーショナルデータベースに変換するための優れたツールであり、CSVと同様に、交換が簡単で、サーバーをセットアップする必要はありません。さらに重要なことはR、他の統計ソフトウェアを非常によくサポートしたことです。

私の戦略は、常にリレーショナルデータベースの「クリーンデータ」を維持することです。そして、各テーブルの主キーを明確にしてください。

これが実際の言葉で起こる可能性のある例です(本を販売していると仮定します)

  • 1日目、すべての顧客情報を含むCSVファイルを受け取りました。
  • 2日目、すべての製品(書籍)情報を含む別のCSVファイルを受け取りました。何らかの理由で、ビジネスではISBNが利用できず、書籍名と著者名の組み合わせが主キーです。
  • 3日目、ビジネスは本のエディションを説明する必要があると判断し、別のCSVを送信してday2のCSVを「上書き」します。
  • 4日目、ビジネスは、顧客情報を更新できることを発見し(住所の変更など)、顧客情報の更新バージョンを送信します。

これで、クリーンなデータの利点を確認し、それらをリレーショナルデータベースに保持できます。sayカスタマーIDを主キーとし、書籍名、著者、エディションを主キーとして使用します。データの更新を行い、必要に応じて変更を組み込むことは非常に簡単です。また、主キーは、新しいデータの「制約」と「健全性チェック」も提供します。


0

Excelの「データのインポート」機能を使用する場合、各列のデータ型を選択するオプションが表示されます。すべての列を選択し、「テキスト」データ型を使用できます。


質問の戦略の要求にこれがどのように応答するか説明していただけますか?
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.