Стратегия редактирования файлов с разделением запятыми (CSV)

18

Когда я работаю над проектами по анализу данных, я часто храню данные в файлах данных с разделителями-запятыми (CSV, TSV). При этом данные часто принадлежат к выделенной системе управления базами данных. Для многих моих приложений это было бы слишком.

Я могу редактировать файлы CSV и TSV в Excel (или, предположительно, в другой программе электронных таблиц). Это имеет преимущества:

  • электронные таблицы облегчают ввод данных

Есть также несколько проблем:

  • Работа с файлами CSV и TSV приводит к появлению большого количества предупреждающих сообщений о потере различных функций и о том, как будет сохранен только активный лист, и так далее. Таким образом, это раздражает, если вы просто хотите открыть файл и внести небольшие изменения.
  • Это делает много "якобы умных" преобразований. Например, если вы введете 12/3, будет думать, что вы хотите ввести дату. ОБНОВЛЕНИЕ: я должен был упомянуть, что пример даты - только один из многих примеров; кажется, что большинство проблем связано с неправильным обращением. В частности, текстовые поля, которые выглядят как числа или даты, вызывают проблемы.

Кроме того, я мог бы работать непосредственно с текстовым файлом в стандартном текстовом редакторе. Это гарантирует, что я ввожу то, что записано. Однако это очень неудобный способ ввода данных (столбцы не выстраиваются в линию; сложно вводить данные просто в несколько ячеек и т. Д.).

Вопрос

  • Какова хорошая стратегия для работы с файлами данных CSV или TSV? то есть, какая стратегия позволяет легко вводить данные и манипулировать ими, а также обеспечивает правильную интерпретацию введенного вами текста?
Джером англим
источник
1
Какие операции вы действительно делаете с файлами? На мой взгляд, это резко влияет на диапазон приемлемых вариантов. Кроме того, мне кажется, что вы можете редактировать данные TSV в текстовом процессоре и выравнивать вкладки, чтобы сохранить столбцы - до тех пор, пока ваш текстовый процессор не настроен на «умные» преобразования и может сохранять в виде открытого текста, что многие могут ,
Уэйн
@ Уэйн Хороший вопрос. Поскольку я вырос на программах для работы с электронными таблицами, есть много знакомых мне ярлыков (функции, копирование и вставка, добавление дополнительного столбца и многое другое). Обратите внимание, я говорю не об анализе данных, а просто о создании простого табличного файла данных (например, некоторой метаинформации, необходимой для обработки моего кода R). Хотя я мог выполнять все эти базовые манипуляции с таблицами в R, он не настолько интуитивен для меня. Вероятно, со временем открытие csv в R, внесение нескольких небольших изменений и сохранение его снова станет моим предпочтительным вариантом.
Джером Энглим

Ответы:

14
  1. Если вы знакомы с R, вы можете создать свой базовый data.frame, а затем использовать для этого функцию fix () для ввода данных. В той же строке, что и # 5, после настройки data.frame вы можете использовать серию readLines (n = 1) (или что угодно), чтобы получить ваши данные, проверить их и предоставить возможность добавить следующую строка. Затем оставьте фиксацию, чтобы исправить (). Смотрите приведенный ниже пример с использованием 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. Быстрый поиск в Google показывает программное обеспечение именно с этой целью, но никакое бесплатное программное обеспечение, похоже, не принесло пользы.
  7. Это звучит безумно, но кто-то из суперпользователей предложил редактировать таблицы в Access, а затем экспортировать их как CSV ... это просто безумие, чтобы работать.
  8. Это не мешает Excel жаловаться, когда вы сохраняете в формате .csv, но вы можете ввести один апостроф перед полем ввода данных, и это заставит его оставить его в покое с точки зрения автоматического форматирования. К счастью, это (по крайней мере, в Office 2007) не оставляет апострофов в файле csv.

Обновление: я много возился по этой проблеме, потому что она тоже есть. На данный момент лучшее / простое решение для ввода данных, которое я когда-либо видел, это KillinkCSV . Это не «бесплатное» программное обеспечение, это условно-бесплатная программа с 30-дневной пробной версией и разумной ценой (~ $ 27). Я не уверен, насколько я доверяю ему для редактирования существующих CSV - я передал ему безумно большой (и, вероятно, хорошо отформатированный) CSV, и он не смог прочитать все строки. Однако, похоже, что он хорошо работает для достаточно большого (20 МБ) файла, и проблема с большим файлом может быть из-за ошибки пользователя с моей стороны.

Пример 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
источник
Да, и оказывается, что я уже csv-mode.elустановил, благодаря emacs-goodies-elпакету в Debian / Ubuntu - аккуратно.
Дирк Эддельбюттель
1
+1, для пункта # 1 все статистические программы, с которыми я когда-либо работал (кроме R, Stata, SPSS и SAS), предоставляют такую ​​функциональность. Таким образом, ваш совет распространяется на любое программное обеспечение, с которым кто-то хочет работать.
Энди Ш
5

Обновление: [Проходя через большое количество рассылок по электронной почте от R-Help], мне напомнили о ветке « Поведениеread.csv() ». В этом Дункан Мердок упоминает, что он предпочитает использовать файлы формата обмена данными (DIF) вместо csv по некоторым причинам, о которых упоминает Джером. Я только что попробовал это, и Gnumeric ошибается (загружая 12/3 как дату), но OpenOffice.org читает это правильно и сохраняет информацию 12/3 без изменений. (Кто-нибудь хочет проверить это в MS Excel?)

Файлы DIF представляют собой простой текст и могут быть прочитаны электронными таблицами, и R (если вы используете последнюю версию R (версия SVN> = r53778)) будет считывать данные в правильном формате.


оригинал : я бы старался по возможности избегать использования полной остановки электронной таблицы для редактирования / манипулирования данными. Невероятно сложно, если не невозможно, документировать любые изменения, которые вы вносите в существующий набор данных, что в значительной степени исключает его с точки зрения воспроизводимых исследований. В большинстве случаев я использую электронную таблицу для быстрого просмотра существующих данных.

Для обработки данных я, как правило, пишу сценарий R, который будет принимать необработанный CSV-файл и применять все необходимые необходимые этапы обработки. Я тщательно комментирую этот сценарий, чтобы точно объяснить, что я делаю на каждом этапе и почему. Мой сценарий анализа данных будет вызывать сценарий обработки данных, который загружает и обрабатывает данные.

Для ввода данных, это более хлопотно для ввода данных в текстовом редакторе или в электронной таблице? Я подозреваю, что проблемы, о которых вы упомянули для последних, не перевешивают попытки ввода данных CSV в текстовый редактор.

Вы можете попробовать лучшую электронную таблицу; OpenOffice.org отказывается прекратить форматирование 12/3 как даты (или преобразует ее в числовое представление), даже если сначала отформатировать столбец как «числовой». Gnumeric, с другой стороны, оставит 12/3, как и прежде, если вы сначала отформатируете столбец как «числовой».

Вы можете заставить OpenOffice.org не переформатировать 12/3 как дату, добавив a 'к записям, т.е.'12/3 Е. Будет отображаться в электронной таблице как 12/3 и сохраняться в виде текста. Это, вероятно, довольно безопасно для использования.

Не уверен, почему вы хотите, чтобы 12/3 численно сохранялось как 12/3 в текстовом файле - как что-то вроде R должно читать это?

Ваш комментарий о предупреждениях о потере функций или только сохранении активного листа на самом деле не является проблемой, не так ли? (Если они есть, то я хочу твоих проблем в жизни ;-)

Восстановить Монику - Дж. Симпсон
источник
Что касается воспроизводимых исследований, если формат файла CSV, то файл CSV можно легко поставить под контроль версий с помощью коммитов при внесении изменений. Будет ли этого достаточно для воспроизводимых исследований? Что касается ввода данных, я часто делаю или заставляю других делать ввод необработанных данных в формате фиксированной ширины, чтобы максимизировать эффективность; однако я предпочитаю хранить данные в CSV или TSV (я нахожу это более прозрачным); относительно форматирования столбца как числового. эта информация, вероятно, будет потеряна при сохранении.
Джером Энглим
Что касается 12/3, у меня был пример теста с множественным выбором, где это представляло 12, разделенное на 3. Однако я использую его больше как иллюстративный пример. Когда у меня есть большой файл CSV, я не хочу ни одного неуместного преобразования. Что касается предупреждений, если я открываю файлы CSV 10 раз в день, предупреждения становятся утомительными. Они также делают менее ясным, сохранил ли я файл CSV или нет. Извините за напыщенную речь.
Jeromy Anglim
@ Джероми, да, было бы, если бы вы строго придерживались одного изменения (или одного шага обработки данных), которое вы немедленно сохраняли и фиксировали. Я имею в виду не включать примечание о выполнении обработки в R (так как это мой предпочтительный язык) с использованием сценария. Вот как я работаю с данными, которые отправляют мне коллеги; Я мог бы быстро просмотреть электронную таблицу, затем прочитать csv в R и написать скрипт, который включает все шаги обработки данных, которые мне нужно применить. Затем я комментирую этот сценарий, чтобы у меня была запись о том, что я сделал и почему я это сделал, и я вообще не изменил исходный файл данных.
Восстановить Монику - Г. Симпсон
@Jeromy: справедливая точка зрения на предупреждения. Я давно отфильтровал их как шум, чтобы они меня не беспокоили. Я только что протестировал Gnumeric и OpenOffice.org, и они автоматически конвертировали CSV с 12/3 в даты - это мусор! Итак, я понимаю, что вы имеете в виду. Единственный способ остановить это - сохранить эти данные в виде текста и принудительно загрузить этот тип данных при загрузке / импорте.
Восстановить Монику - Г. Симпсон
@Jeromy: re: потеря числового форматирования - да, будет, если вы не указали тип столбца как «числовой» (Gnumeric) или «текстовый» в (OpenOffice.org) при импорте. Лучше было бы сохранить его в виде текста (см. Мой отредактированный ответ), чтобы избежать преобразования - вам все равно нужно будет указать тип данных при импорте ...
Восстановить Монику - Г. Симпсон
3

Я предлагаю вам взглянуть на Google уточнение (http://code.google.com/p/google-refine/). Я думаю, что это очень хороший инструмент для редактирования файлов CSV


источник
Не могли бы вы объяснить, как это отвечает на запрос стратегии в вопросе?
whuber
3

Я бы избегал совместной работы с файлами CSV и TSV. Вместо этого научитесь использовать SQL и работайте только с копией ваших данных datamart или базы данных (БД), или вы можете использовать SAS или R с промежуточным подключением к вашей базе данных. Таким образом, вы можете делать массовые обновления своих данных вместо того, чтобы делать страшные операции поиска и замены в Excel (или любой другой программе для работы с электронными таблицами, которую вы используете) или копировать и вставлять, что может привести к ошибкам. Преимущество использования системы БД также заключается в том, что вы можете включить ведение журнала и быстрый откат внесенных вами изменений, если они были сделаны по ошибке и все изменения могут быть проверены. Кроме того, ограничения целостности могут быть наложены на ваши таблицы БД, чтобы гарантировать, что вы не по ошибке обновите или измените переменные / столбец способами, которые вы считаете неподходящими (например, даты остаются в качестве дат, а другая информация вводится соответствующим образом). Я выиграл'

Если вам нравятся электронные таблицы, потому что они каким-то образом облегчают ввод данных, это можно преодолеть в каждой базе данных, которую я когда-либо использовал, используя инструменты графического интерфейса пользователя / IDE, которые поставляются с базами данных (например, Microsoft Management Studio), или добавив связанную версию вашей базы данных в систему, специально предназначенную для ввода ваших данных и обеспечения ограничений данных (например, формы связанных таблиц в Access или пользовательский веб-интерфейс). Вы также можете использовать другие программы, которые позволят вам получить лучшее из обоих миров и обновить данные в Excel и распространить эти изменения на вашу базу данных (см., Например, https://www.youtube.com/watch?v=5iyuF_mDSac ). ,

StatsStudent
источник
2

После того, как я задал этот вопрос, я начал смотреть на CSVed .

С веб-сайта:

CSVed - это простой и мощный редактор файлов CSV, вы можете манипулировать любым файлом CSV, разделенным любым разделителем.

Я не уверен, если у кого-то есть опыт с этим.

Джером англим
источник
Я пытался установить его. После быстрой попытки это показалось мусором для ввода данных; возможно, если бы я попробовал это дольше, я смог бы понять, как эффективно использовать его, но я подозреваю, что нет.
russellpierce
Не могли бы вы объяснить, как это отвечает на запрос стратегии в вопросе?
whuber
2

Excel не очень дружелюбен к CSV. Например, если вы введете «1 300» в Excel и сохраните его как значение, разделенное запятыми, это позволит вам! Это может быть большой проблемой (я сталкиваюсь с этим регулярно при получении файлов от других).

Я лично использую OpenOffice.org Calc, я также использую многие решения, перечисленные выше, однако многие из них не имеют функциональности и простоты использования, которые требуются для обычного редактирования. OOO Calc намного умнее, чем Excel, хотя, будучи программой для работы с электронными таблицами, вам все равно придется вводить «= 12/3» вместо «12/3», иначе вы будете вводить значение, а не расчет.

Повернись, ты не будешь разочарован.

Адам
источник
1

Мне нравится Gnumeric, потому что он не пытается быть настолько устойчивым к идиотам, как другие (он не кричит о потерянной функциональности) и работает с большими данными ... но я думаю, что это только для Linux.


источник
1
после этого вопроса я
устроился
1
хотя он предупреждает только о сохранении текущего листа (который был одним из ошибок медведя Джерома) и имеет раздражающую функцию преобразования правильно сохраненных 12/3 чисел в даты, если вы вручную не укажете, что они числовые при импорте (Данные> Получить Внешние данные> Импорт текстового файла ...) не загружается.
Восстановить Монику - Дж. Симпсон
Не могли бы вы объяснить, как это отвечает на запрос стратегии в вопросе?
whuber
1

Просто используйте редактор Рона . Это как Excel без «помощи».

С сайта:

Редактор Рона - это мощный текстовый редактор, или CSV. Он может открывать любой формат разделенного текста, включая стандартные файлы, разделенные запятыми и табуляцией (CSV и TSV), и позволяет полностью контролировать их содержимое и структуру.

Табличные текстовые файлы можно не только редактировать, но также легко фильтровать и суммировать в любом количестве дополнительных представлений, добавляя мощные функции анализа.

  • Лицензия: бесплатно для личного использования / оценки
  • Работает на: Windows 32/64-bit 2000 / XP / 2003 / Vista /
Аарон Стюарт
источник
Не могли бы вы объяснить, как это отвечает на запрос стратегии в вопросе?
whuber
1

Мне лично нравится использовать идею «реляционной базы данных» для управления файлами CSV. CSV-файлы хороши для обмена данными, но не содержат бизнес-логики. Мой опыт работы с CSV: «Есть много итераций в бизнесе, чтобы уточнить анализ». Работа только с простыми текстовыми файлами (CSV) создаст много проблем. Например, файл CSV не будет показывать «что делает данные уникальными», т. Е. Что такое «первичный ключ каждой строки». Это вызовет большие проблемы позже, когда к нам присоединится другой источник данных.

SQLite - это хороший инструмент для превращения CSV в реляционную базу данных, и, как и CSV, его легко обменивать, и настройка сервера не требуется. Что еще более важно, он очень хорошо поддерживалR и другое статистическое программное обеспечение.

Моя стратегия всегда поддерживать «очищенные данные» в реляционной базе данных. И держите это ясно на первичном ключе каждой таблицы.

Вот пример того, что может произойти на самом деле (предположим, мы продаем книги):

  • День 1, я получил CSV-файл, содержащий всю информацию о клиентах.
  • На второй день я получил еще один CSV-файл, содержащий всю информацию о продуктах (книгах). По какой-то причине бизнес заявил, что номер ISBN недоступен, а сочетание названия книги и имени автора является первичным ключом.
  • День 3: необходимо найти издание книги «Бизнес нашел», они отправили еще одного CSV, чтобы «перезаписать» CSV дня 2.
  • День 4, Бизнес обнаружил, что информация о клиентах может быть обновлена ​​(например, изменение адреса), они отправляют обновленную версию информации о клиентах.

Теперь вы можете увидеть преимущество чистых данных и хранить их в реляционной базе данных. С использованием идентификатора клиента в качестве первичного ключа и имени книги, автора и издания в качестве первичного ключа. Обновление данных и внесение изменений по мере необходимости очень просто. Также первичный ключ также дает «ограничения» и «проверку работоспособности» для новых поступающих данных.

Haitao Du
источник
0

Если вы используете функцию «Импорт данных» в Excel, вы сможете выбрать тип данных для каждого столбца. Вы можете выбрать все столбцы и использовать тип данных «Текст».

круглый квадрат
источник
Не могли бы вы объяснить, как это отвечает на запрос стратегии в вопросе?
whuber