Strategi untuk mengedit file comma separated value (CSV)

18

Ketika saya mengerjakan proyek analisis data, saya sering menyimpan data dalam file data koma atau dibatasi-tab (CSV, TSV). Sementara data sering termasuk dalam sistem manajemen basis data khusus. Untuk banyak aplikasi saya, ini akan menjadi hal yang berlebihan.

Saya dapat mengedit file CSV dan TSV di Excel (atau mungkin program Spreadsheet lain). Ini memiliki manfaat:

  • spreadsheet membuatnya mudah untuk memasukkan data

Ada juga beberapa masalah:

  • Bekerja dengan file CSV dan TSV mengarah ke berbagai pesan peringatan tentang berbagai fitur yang hilang dan bagaimana hanya lembar aktif yang akan disimpan dan sebagainya. Dengan demikian, itu menjengkelkan jika Anda hanya ingin membuka file dan membuat sedikit perubahan.
  • Itu banyak konversi "seharusnya cerdas". Misalnya, jika Anda memasukkan 12/3, itu akan berpikir bahwa Anda ingin memasukkan tanggal. PEMBARUAN: Saya seharusnya menyebutkan bahwa contoh tanggal hanyalah salah satu dari banyak contoh; sebagian besar masalah tampaknya terkait dengan konversi yang tidak tepat. Secara khusus, bidang teks yang terlihat seperti angka atau tanggal menyebabkan masalah.

Atau, saya bisa bekerja secara langsung dengan file teks dalam editor teks standar. Ini memastikan bahwa apa yang saya masukkan adalah apa yang dicatat. Namun itu adalah cara yang sangat canggung untuk memasukkan data (kolom tidak berbaris; sulit untuk memasukkan data hanya ke banyak sel; dll.).

Pertanyaan

  • Apa strategi yang baik untuk bekerja dengan file data CSV atau TSV? yaitu, strategi apa yang membuatnya mudah untuk memasukkan dan memanipulasi data sembari memastikan bahwa apa yang Anda masukkan benar-benar ditafsirkan dengan benar?
Jeromy Anglim
sumber
1
Operasi apa yang sebenarnya Anda lakukan pada file? Dalam pikiran saya, itu secara dramatis memengaruhi berbagai opsi yang dapat diterima. Selain itu, bagi saya tampaknya Anda dapat mengedit data TSV dalam pengolah kata dan barisan tab untuk mempertahankan kolom - selama pengolah kata Anda dapat diatur untuk tidak melakukan konversi "pintar" dan dapat menyimpan sebagai plaintext, yang banyak orang dapat .
Wayne
@Wayne Poin bagus. Karena saya tumbuh dengan program spreadsheet, ada banyak pintasan yang saya kenal (fungsi, salin dan tempel, tambahkan kolom tambahan, dan banyak lagi). Catatan, saya tidak berbicara di sini tentang analisis data, tetapi hanya membuat file data tabular sederhana (misalnya, beberapa informasi meta diperlukan untuk memproses kode R saya). Sementara saya bisa melakukan semua manipulasi tabel dasar ini di R, itu tidak cukup intuitif bagi saya. Mungkin seiring waktu, membuka csv di R, membuat sedikit perubahan dan menyimpannya lagi akan menjadi pilihan yang saya sukai.
Jeromy Anglim

Jawaban:

14
  1. Jika Anda merasa nyaman dengan R, Anda dapat membuat data.frame dasar dan kemudian menggunakan fungsi fix () untuk memasukkan data. Sepanjang baris yang sama dengan # 5, setelah Anda mengatur data.frame Anda dapat menggunakan serangkaian readLines (n = 1) (atau apa pun) untuk memasukkan data Anda, memvalidasinya, dan memberikan kesempatan untuk menambahkan berikutnya baris. Kemudian biarkan perbaikan untuk memperbaiki (). Lihat contoh yang diterapkan di bawah ini menggunakan pemindaian ().

  2. Pilihan lain di excel akan berantakan, tetapi Anda bisa mengetikkan 12/9, lalu minta kolom lain untuk mengevaluasi = IFERROR (MONTH (DateEntryCell) / DAY (DataEntryCell), DataEntryCell). Tetapi kemudian Anda harus mempertahankan lembar excel DAN lembar csv dan semua keluhan saat Anda menulis csv akan bertahan.

  3. Atau, asalkan bidang Anda relatif pendek dan memiliki panjang yang konsisten, editor teks biasa akan membantu Anda dengan baik dengan TSV. Anda selalu dapat memuatnya di excel saat Anda selesai dan pastikan jumlah kolom untuk setiap baris sesuai dengan yang Anda harapkan.
  4. Emacs tersedia pada sejumlah platform dan mungkin memiliki sesuatu hanya untuk ini, misalnya http://www.emacswiki.org/emacs/CsvMode .
  5. Jika Anda adalah jiwa yang tulus, memprogram sesuatu dengan cepat dalam bahasa pemrograman untuk melakukan entri data itu sepele, pengeditan data akan jauh lebih sulit.
  6. Pencarian cepat Google menunjukkan perangkat lunak hanya dengan tujuan ini, tetapi tampaknya tidak ada perangkat lunak gratis yang bagus.
  7. Kedengarannya gila, tetapi seseorang di pengguna super menyarankan mengedit tabel dalam akses dan kemudian mengekspornya sebagai CSV ... yang cukup gila untuk bekerja.
  8. Itu tidak berhenti excel dari mengeluh saat Anda menyimpan sebagai .csv, tetapi Anda dapat mengetik satu tanda kutip sebelum bidang entri data Anda dan itu membuatnya meninggalkannya sendirian dalam hal pemformatan otomatis. Baik, ini (setidaknya di Office 2007) tidak meninggalkan apostrof dalam file csv.

Pembaruan: Saya sudah sering membahas masalah ini karena ini adalah masalah yang juga saya miliki. Sejauh ini solusi terbaik / termudah untuk entri data yang pernah saya lihat sejauh ini adalah KillinkCSV . Ini bukan perangkat lunak "gratis", itu shareware dengan durasi percobaan 30 hari dan harga yang wajar (~ $ 27). Saya tidak yakin seberapa besar saya mempercayainya untuk mengedit CSV yang ada - saya menyerahkan CSV yang sangat besar (dan mungkin diformat dengan baik) dan gagal membaca semua baris. Namun sepertinya itu bekerja dengan baik untuk yang cukup besar (20 MB) dan masalah dengan file yang lebih besar mungkin kesalahan pengguna pada bagian saya.

Contoh 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"))
russellpierce
sumber
Yap, dan ternyata saya sudah csv-mode.elmenginstalnya berkat emacs-goodies-elpaket di Debian / Ubuntu - rapi.
Dirk Eddelbuettel
1
+1, Untuk poin # 1 semua perangkat lunak stat yang pernah saya gunakan (selain R, Stata, SPSS, dan SAS) dengan menyediakan fungsionalitas jenis ini. Jadi saran Anda digeneralisasikan ke perangkat lunak apa pun yang ingin digunakan seseorang.
Andy W
5

Pembaruan: [Setelah melalui tumpukan besar email dari R-Help] Saya teringat akan utas pada " Perilakuread.csv() ". Dalam hal ini, Duncan Murdoch menyebutkan bahwa dia lebih suka menggunakan file Data Interchange Format (DIF) daripada csv untuk beberapa alasan yang disebutkan Jeromy. Saya baru saja mencoba ini dan Gnumeric salah (memuat 12/3 sebagai tanggal), tetapi OpenOffice.org membaca ini dengan benar dan mempertahankan informasi 12/3 tetap utuh. (Adakah yang mau memeriksa ini di MS Excel?)

File DIF adalah teks biasa dan dapat dibaca oleh spreadsheet dan R (selama Anda menggunakan revisi R baru-baru ini (revisi SVN> = r53778)) akan membaca data dalam format yang benar.


Asli : Saya akan mencoba untuk tidak menggunakan penghentian penuh spreadsheet untuk mengedit / memanipulasi data bila memungkinkan. Sangat sulit, jika bukan tidak mungkin, untuk mendokumentasikan setiap perubahan yang Anda buat pada kumpulan data yang ada sehingga cukup banyak aturan itu keluar dari sudut pandang penelitian yang dapat direproduksi. Paling-paling, saya menggunakan spreadsheet untuk dengan cepat melihat data yang ada.

Untuk pemrosesan data, saya cenderung menulis skrip R yang akan mengambil file csv mentah dan menerapkan semua langkah pemrosesan yang diperlukan. Saya sangat berkomentar skrip itu untuk menjelaskan apa yang saya lakukan pada setiap tahap dan mengapa. Skrip analisis data saya kemudian akan memanggil skrip pemrosesan data yang memuat dan memproses data.

Untuk entri data, apakah lebih sulit untuk memasukkan data dalam editor teks atau dalam spreadsheet? Saya menduga masalah yang Anda sebutkan untuk yang terakhir tidak melebihi masalah mencoba memasukkan data CSV ke dalam editor teks.

Anda dapat mencoba spreadsheet yang lebih baik; OpenOffice.org menolak untuk berhenti memformat 12/3 sebagai tanggal (atau mengubahnya menjadi representasi numerik) bahkan jika seseorang memformat kolom sebagai "numerik" terlebih dahulu. Gnumeric di sisi lain akan meninggalkan 12/3 karena jika Anda memformat kolom sebagai "numerik" terlebih dahulu.

Anda dapat memaksa OpenOffice.org untuk tidak memformat ulang 12/3 sebagai tanggal dengan menambahkannya 'pada entri, yaitu '12/3akan ditampilkan sebagai 12/3 dalam spreadsheet dan disimpan sebagai teks. Ini mungkin cukup aman untuk digunakan.

Tidak yakin mengapa Anda ingin 12/3 disimpan secara numerik sebagai 12/3 dalam file teks - bagaimana seharusnya sesuatu seperti R membaca ini?

Komentar Anda tentang peringatan tentang kehilangan fitur atau hanya menyimpan lembar aktif bukan masalah, bukan? (Jika ya, maka saya ingin masalah Anda dalam hidup saya ;-)

Pasang kembali Monica - G. Simpson
sumber
Berkenaan dengan penelitian direproduksi, jika format file adalah CSV, maka file CSV dapat dengan mudah diletakkan di bawah kontrol versi dengan komit ketika perubahan dibuat. Apakah ini cukup untuk penelitian yang dapat direproduksi? Sehubungan dengan entri data, saya sering melakukan atau membuat orang lain melakukan entri data mentah dalam format fix width untuk memaksimalkan efisiensi; namun saya lebih suka menyimpan data dalam CSV atau TSV (saya merasa lebih transparan); berkaitan dengan memformat kolom sebagai angka. informasi ini mungkin akan hilang karena penghematan.
Jeromy Anglim
dengan salam 12/3, saya punya contoh tes pilihan ganda di mana ini mewakili 12 dibagi dengan 3. Namun, saya lebih menggunakannya sebagai contoh ilustrasi. Ketika saya memiliki file CSV yang besar, saya tidak ingin satu pun konversi yang tidak pantas. Sehubungan dengan peringatan, Jika saya membuka file CSV 10 kali sehari, peringatan menjadi membosankan. Mereka juga membuatnya kurang jelas apakah saya benar-benar menyimpan file CSV atau tidak. Maaf untuk kata-kata kasar.
Jeromy Anglim
@ Jeromy ya, itu akan terjadi, jika Anda ketat tentang membuat perubahan tunggal (atau langkah pemrosesan data tunggal) yang segera Anda simpan dan komit. Saya bermaksud untuk tidak menyertakan catatan tentang melakukan pemrosesan dalam R (karena ini adalah bahasa pilihan saya) menggunakan skrip. Itulah cara saya bekerja dengan kolega data yang mengirim saya; Saya mungkin melihat cepat dalam spreadsheet, lalu membaca csv ke R dan menulis skrip yang mencakup semua langkah pemrosesan data yang perlu saya terapkan. Saya kemudian berkomentar skrip itu sehingga saya memiliki catatan tentang apa yang saya lakukan dan mengapa saya melakukannya dan saya belum mengubah file data asli sama sekali.
Pasang kembali Monica - G. Simpson
@Jeromy: titik adil pada peringatan. Saya sudah lama menyaringnya sebagai suara sehingga mereka tidak mengganggu saya. Saya baru saja menguji Gnumeric dan OpenOffice.org dan mereka mengonversi csv dengan 12/3 menjadi tanggal secara otomatis - itu adalah sampah! Jadi saya mengerti maksud Anda. Satu-satunya cara untuk menghentikannya adalah dengan menyimpan data tersebut sebagai teks dan memaksakan tipe data itu pada load / import.
Pasang kembali Monica - G. Simpson
@Jeromy: re: kehilangan format numerik - ya, itu akan, kecuali jika Anda menentukan jenis kolom sebagai "numerik" (Gnumerik) atau "teks" dalam (OpenOffice.org) setelah impor. Lebih baik menyimpannya sebagai teks (lihat jawaban saya yang diedit) untuk menghindari konversi - Anda masih perlu menentukan tipe data setelah impor ...
Reinstate Monica - G. Simpson
3

Saya sarankan Anda melihat google refine (http://code.google.com/p/google-refine/). Saya pikir ini adalah alat yang sangat bagus untuk mengedit file CSV


sumber
Bisakah Anda jelaskan bagaimana ini menanggapi permintaan strategi dalam pertanyaan?
whuber
3

Saya akan menghindari bekerja dengan file CSV dan TSV bersama-sama. Alih-alih belajarlah menggunakan SQL dan operasikan hanya pada datamart atau database (DB) salinan data Anda atau Anda bisa menggunakan SAS atau R dengan koneksi passthru ke database Anda. Dengan cara itu Anda dapat membuat pembaruan massal untuk data Anda alih-alih melakukan pencarian dan penggantian yang ditakuti di Excel (atau program spreadsheet apa pun yang Anda gunakan) atau menyalin dan menempel yang mungkin rentan terhadap kesalahan. Keuntungan menggunakan sistem DB juga adalah Anda dapat mengaktifkan logging dan dengan cepat mengembalikan perubahan yang telah Anda buat jika mereka membuat kesalahan dan semua perubahan dapat diaudit. Selain itu, kendala integritas dapat ditempatkan pada tabel DB Anda untuk memastikan Anda tidak salah memperbarui atau mengubah variabel / kolom dengan cara yang Anda anggap tidak pantas (mis. Tanggal tetap sebagai tanggal dan informasi lainnya diketik dengan tepat). Saya menang'

Jika Anda menyukai spreadsheet karena entah bagaimana memudahkan entri data Anda, itu dapat diatasi di setiap database yang pernah saya gunakan dengan menggunakan alat antarmuka pengguna grafis / IDE yang datang dengan database (misalnya Studio Manajemen Microsoft) atau dengan menarik versi yang ditautkan dari basis data Anda ke dalam sistem yang dirancang khusus untuk memasukkan data Anda dan menegakkan batasan data (misalnya formulir tabel yang ditautkan dalam Access atau antarmuka web khusus). Anda juga dapat menggunakan program lain yang akan memungkinkan Anda untuk mendapatkan yang terbaik dari kedua dunia dan memperbarui data di Excel dan meminta perubahan itu menyebar ke database Anda (lihat https://www.youtube.com/watch?v=5iyuF_mDSac misalnya) .

StatsStudent
sumber
2

Setelah saya mengajukan pertanyaan ini, saya mulai melihat CSVed .

Dari situs web:

CSVed adalah editor file CSV yang mudah dan kuat, Anda dapat memanipulasi file CSV apa pun, dipisahkan dengan pemisah apa pun.

Saya tidak yakin apakah ada yang punya pengalaman dengannya.

Jeromy Anglim
sumber
Saya mencoba menginstalnya. Setelah mencoba dengan cepat, rasanya seperti sampah untuk entri data; mungkin jika saya mencobanya lebih lama saya akan dapat mengetahui cara menggunakannya secara efektif, tapi saya kira tidak.
russellpierce
Bisakah Anda jelaskan bagaimana ini menanggapi permintaan strategi dalam pertanyaan?
whuber
2

Excel tidak terlalu ramah CSV. Misalnya, jika Anda memasukkan "1.300" ke Excel, dan menyimpannya sebagai nilai yang dipisahkan koma, itu akan membiarkan Anda! Ini bisa menjadi masalah besar (saya temui secara teratur ketika menerima file dari orang lain).

Saya pribadi menggunakan OpenOffice.org Calc, saya juga menggunakan banyak solusi yang tercantum di atas, namun banyak dari ini tidak memiliki fungsi dan kemudahan penggunaan yang diperlukan untuk pengeditan reguler. OOO Calc jauh lebih cerdas daripada Excel, meskipun menjadi program spreadsheet, Anda masih harus memasukkan "= 12/3" daripada "12/3" jika tidak, Anda akan memasukkan nilai, bukan perhitungan.

Berputar, Anda tidak akan kecewa.

Adam
sumber
1

Saya suka Gnumeric karena tidak mencoba untuk menjadi sangat idiot-tahan seperti yang lain (tidak berteriak tentang kehilangan fungsionalitas) dan bekerja dengan data besar ... namun saya pikir itu hanya Linux.


sumber
1
mengikuti pertanyaan ini, saya melakukan perburuan: ada versi Windows projects.gnome.org/gnumeric/downloads.shtml
Jeromy Anglim
1
itu memperingatkan tentang hanya menyimpan lembar saat ini (yang merupakan salah satu bug-beruang Jeromy), dan ia memiliki fitur yang mengganggu mengkonversi 12/12 angka yang disimpan dengan benar ke tanggal kecuali Anda secara manual menentukan mereka numerik pada impor (Data> Dapatkan Data Eksternal> Impor File Teks ...) tidak dimuat.
Pasang kembali Monica - G. Simpson
Bisakah Anda jelaskan bagaimana ini menanggapi permintaan strategi dalam pertanyaan?
whuber
1

Cukup gunakan Editor Ron . Seperti halnya Excel tanpa 'bantuan'.

Dari situs:

Editor Ron adalah editor teks tabular, atau CSV, yang kuat. Itu dapat membuka semua format teks yang dipisahkan, termasuk koma standar dan file yang dipisahkan tab (CSV dan TSV), dan memungkinkan kontrol total atas konten dan strukturnya.

File teks tabel tidak hanya dapat diedit, tetapi mereka juga dapat dengan mudah difilter dan diringkas dalam sebanyak mungkin tampilan tambahan yang diperlukan, menambahkan fungsionalitas analisis yang kuat.

  • Lisensi: Gratis untuk penggunaan / evaluasi pribadi
  • Berjalan pada: Windows 32/64-bit 2000 / XP / 2003 / Vista /
Aaron Stewart
sumber
Bisakah Anda jelaskan bagaimana ini menanggapi permintaan strategi dalam pertanyaan?
whuber
1

Saya pribadi suka menggunakan ide "database relasional" untuk mengelola file CSV. File CSV baik untuk bertukar data, tetapi tidak mengandung logika bisnis. Pengalaman saya bekerja dengan CSV adalah "ada banyak iterasi dengan bisnis untuk memperbaiki analisis". Bekerja hanya dengan file teks biasa (CSV) akan menimbulkan banyak tantangan. Misalnya, file CSV tidak akan menampilkan "apa yang membuat data unik", yaitu, apa "kunci utama untuk setiap baris". Ini akan menyebabkan masalah besar di kemudian hari, ketika kita memiliki sumber data lain untuk bergabung.

SQLite adalah alat yang baik untuk membuat CSV menjadi basis data relasional, dan mirip dengan CSV, mudah ditukar, dan tidak diperlukan pengaturan server. Lebih penting lagi, ini didukung dengan sangat baik dalam Rdan perangkat lunak statistik lainnya.

Strategi saya selalu menjaga "data yang dibersihkan" dalam basis data relasional. Dan tetap jelas pada kunci utama setiap tabel.

Ini adalah contoh dari apa yang mungkin terjadi dengan kata yang sebenarnya (misalkan kita menjual buku):

  • Hari 1, saya menerima file CSV yang berisi semua informasi pelanggan.
  • Hari 2, saya menerima file CSV lain yang berisi semua informasi produk (buku). Untuk beberapa alasan, bisnis mengatakan tidak ada ISBN yang tersedia dan kombinasi nama buku dan nama penulis adalah kunci utama.
  • Hari 3, Bisnis menemukan edisi buku perlu dipertanggungjawabkan, mereka mengirim CSV lain untuk "menimpa" CSV day2.
  • Hari 4, Bisnis menemukan informasi pelanggan dapat diperbarui (seperti perubahan alamat), mereka mengirim versi informasi pelanggan yang diperbarui.

Sekarang, Anda dapat melihat keuntungan dari data bersih dan menyimpannya di basis data relasional. Dengan mengatakan ID pelanggan sebagai kunci utama, dan nama buku, penulis, dan edisi sebagai kunci utama. Sangat mudah untuk membuat pembaruan data dan memasukkan perubahan sesuai kebutuhan. Juga kunci utama juga memberikan "kendala" dan "pemeriksaan kewarasan" untuk data baru yang akan datang.

Haitao Du
sumber
0

Jika Anda menggunakan fitur "Impor Data" Excel, itu akan memberi Anda opsi untuk memilih tipe data untuk setiap kolom. Anda dapat memilih semua kolom dan menggunakan tipe data "Teks".

roundsquare
sumber
Bisakah Anda jelaskan bagaimana ini menanggapi permintaan strategi dalam pertanyaan?
whuber