Estratégia para editar arquivos de valor separado por vírgula (CSV)

18

Quando trabalho em projetos de análise de dados, costumo armazenar dados em arquivos de dados separados por vírgula ou tabulação (CSV, TSV). Enquanto os dados geralmente pertencem a um sistema de gerenciamento de banco de dados dedicado. Para muitos dos meus aplicativos, isso seria exagero.

Posso editar arquivos CSV e TSV no Excel (ou presumivelmente outro programa de planilha). Isso tem benefícios:

  • planilhas facilitam a inserção de dados

Existem também vários problemas:

  • Trabalhar com arquivos CSV e TSV leva a uma ampla gama de mensagens de aviso sobre a perda de vários recursos e como somente a planilha ativa será salva e assim por diante. Portanto, é irritante se você apenas deseja abrir o arquivo e fazer uma pequena alteração.
  • Faz muitas conversões "supostamente inteligentes". Por exemplo, se você digitar 12/3, ele pensará que deseja inserir uma data. UPDATE: Eu deveria ter mencionado que o exemplo de data é apenas um dos muitos exemplos; a maioria dos problemas parece estar relacionada à conversão inadequada. Em particular, os campos de texto que parecem números ou datas causam problemas.

Como alternativa, eu poderia trabalhar diretamente com o arquivo de texto em um editor de texto padrão. Isso garante que o que eu entro é o que é gravado. No entanto, é uma maneira muito incômoda de inserir dados (as colunas não se alinham; é difícil inserir dados simplesmente em várias células; etc.).

Questão

  • Qual é uma boa estratégia para trabalhar com arquivos de dados CSV ou TSV? ou seja, qual estratégia facilita a inserção e manipulação dos dados, além de garantir que o que você digita seja realmente interpretado corretamente?
Jeromy Anglim
fonte
1
Que tipo de operações você realmente realiza nos arquivos? Na minha opinião, isso afeta drasticamente o leque de opções aceitáveis. Além disso, parece-me que você pode editar dados TSV em um processador de texto e alinhar guias para preservar colunas - desde que seu processador de texto possa ser configurado para não fazer conversões "inteligentes" e salvar como texto simples, o que muitos podem .
Wayne
@Wayne Bom ponto. Como eu cresci com programas de planilhas, existem muitos atalhos com os quais estou familiarizado (funções, copiar e colar, adicionar uma coluna extra e muito mais). Note, eu não estou falando aqui sobre análise de dados, mas apenas criando um arquivo de dados tabulares simples (por exemplo, algumas informações meta necessárias para processar meu código R). Embora eu possa fazer todas essas manipulações básicas de tabela em R, não é tão intuitivo para mim. Provavelmente, com o tempo, abrir um csv em R, fazer algumas pequenas alterações e salvá-lo novamente se tornará minha opção preferida.
Jeromy Anglim

Respostas:

14
  1. Se você se sentir confortável com o R, poderá criar seu data.frame básico e, em seguida, usar a função fix () para inserir dados. Na mesma linha que o 5, depois de configurar o data.frame, você pode usar uma série de readLines (n = 1) (ou o que seja) para obter seus dados, validá-los e oferecer a oportunidade de adicionar o próximo linha. Em seguida, deixe a fixação em fix (). Veja um exemplo implementado abaixo usando scan ().

  2. Outra opção no Excel seria uma bagunça, mas você pode digitar 12/9 e, em seguida, outra coluna avaliar = IFERROR (MÊS (DateEntryCell) / DIA (DataEntryCell), DataEntryCell). Mas então você terá que manter a planilha do excel E a planilha csv e todas as queixas à medida que escreve o csv persistirá.

  3. Como alternativa, desde que seus campos sejam relativamente curtos e tenham um comprimento consistente, um editor de texto comum deve atendê-lo bem com o TSV. Você sempre pode carregá-lo no Excel quando terminar e verifique se o número de colunas para cada linha é o que você espera que seja.
  4. O Emacs está disponível em várias plataformas e provavelmente tem algo justamente para isso, por exemplo, http://www.emacswiki.org/emacs/CsvMode .
  5. Se você é uma alma saudável, programar algo rápido em uma linguagem de programação para fazer a entrada de dados é trivial, a edição de dados será muito mais difícil.
  6. Uma pesquisa rápida no Google mostra software com esse objetivo, mas nenhum software livre parecia bom.
  7. Parece insano, mas alguém no superusuário sugeriu editar tabelas no acesso e depois exportá-las como CSV ... isso é louco o suficiente para funcionar.
  8. Ele não impede que o Excel se queixe ao salvar como .csv, mas você pode digitar um único apóstrofo antes do campo de entrada de dados e isso o deixa em paz em termos de formatação automática. Bem, isso (no Office 2007, pelo menos) não deixa apóstrofos no arquivo csv.

Atualização: eu estive bisbilhotando muito esse problema, porque também é um problema. Até agora, a melhor / mais fácil solução para entrada de dados que vi até agora é o KillinkCSV . Não é um software "gratuito", é um shareware com uma duração de avaliação de 30 dias e um preço razoável (~ US $ 27). No entanto, não sei quanto confio para editar os CSVs existentes - entreguei a ele um CSV incrivelmente grande (e presumivelmente bem formatado) e ele falhou ao ler todas as linhas. No entanto, parecia funcionar bem para um que era razoavelmente grande (20 MB) e o problema com o arquivo maior pode ser um erro do usuário da minha parte.

R Exemplo:

#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
fonte
Sim, e acontece que eu já tenho csv-mode.el instalei graças ao emacs-goodies-elpacote no Debian / Ubuntu - puro.
Dirk Eddelbuettel
1
+1, para o ponto 1, todos os softwares de estatística em que trabalhei (além de R, Stata, SPSS e SAS) fornecem esse tipo de funcionalidade. Portanto, seu conselho se generaliza para qualquer software com o qual alguém queira trabalhar.
Andy W
5

Atualização: [Depois de analisar um grande estoque de emails da R-Help], lembro-me do tópico " O comportamento deread.csv() ". Nisso, Duncan Murdoch menciona que prefere usar arquivos DIF (Data Interchange Format) em vez de csv por alguma das razões pelas quais Jeromy menciona. Eu apenas tentei isso e o Gnumeric está errado (carregando 12/3 como uma data), mas o OpenOffice.org lê isso corretamente e preserva as informações 12/3 intactas. (Alguém quer verificar isso no MS Excel?)

Os arquivos DIF são texto simples e podem ser lidos por planilhas e R (desde que você use uma revisão R recente (revisão SVN> = r53778)) lerá os dados no formato correto.


Original : eu tentaria evitar o uso de uma parada completa da planilha para edição / manipulação de dados sempre que possível. É incrivelmente difícil, se não impossível, documentar as alterações feitas em um conjunto de dados existente, de modo que praticamente o exclua do ponto de vista reprodutível da pesquisa. No máximo, uso uma planilha para visualizar rapidamente os dados existentes.

Para o processamento de dados, costumo escrever um script R que pegue o arquivo csv bruto e aplique todas as etapas de processamento necessárias. Eu comento fortemente esse script para explicar exatamente o que estou fazendo em cada estágio e por quê. Meu script de análise de dados chamaria o script de processamento de dados que carrega e processa os dados.

Para entrada de dados, é mais difícil inserir os dados em um editor de texto ou em uma planilha? Eu suspeito que os problemas que você mencionou para os últimos não superam os de tentar inserir dados CSV em um editor de texto.

Você pode tentar uma planilha melhor; O OpenOffice.org se recusa a interromper a formatação de 12/3 como uma data (ou a converte na representação numérica), mesmo que se formate a coluna como "numérico" primeiro. O Gnumeric, por outro lado, deixará 12/3 como é se você formatar a coluna como "numérica" ​​primeiro.

Você pode forçar o OpenOffice.org a não reformatar 12/3 como uma data, acrescentando 'a às entradas, ou seja, '12/3será exibido como 12/3 na planilha e salvo como texto. Provavelmente é bastante seguro de usar.

Não sabe por que você quer que o 12/3 seja armazenado numericamente como 12/3 no arquivo de texto - como algo como R deve ler isso?

Seu comentário sobre avisos sobre a perda de recursos ou o salvamento apenas da planilha ativa não são realmente problemas, são? (Se eles são, então eu quero seus problemas na minha vida ;-)

Restabelecer Monica - G. Simpson
fonte
Com relação à pesquisa reproduzível, se o formato do arquivo for CSV, o arquivo CSV poderá ser facilmente colocado sob controle de versão com confirmações quando forem feitas alterações. Isso seria suficiente para pesquisas reproduzíveis? No que diz respeito à entrada de dados, muitas vezes eu faço ou convido outras pessoas a fazer a entrada de dados brutos no formato de largura fixa para maximizar a eficiência; no entanto, prefiro armazenar dados em CSV ou TSV (acho mais transparente); no que diz respeito à formatação de uma coluna como numérica. presumivelmente, essa informação seria perdida ao salvar.
Jeromy Anglim
no que diz respeito a 12/3, eu tinha um exemplo de teste de múltipla escolha em que isso representava os 12 dividido por 3. No entanto, eu o uso mais como um exemplo ilustrativo. Quando tenho um arquivo CSV grande, não quero nem uma conversão inadequada. No que diz respeito aos avisos, se estou abrindo arquivos CSV 10 vezes por dia, os avisos ficam entediantes. Eles também deixam menos claro se eu realmente salvei o arquivo CSV ou não. Desculpe pelo discurso retórico.
Jeromy Anglim
@ Jeromy sim, seria, se você fosse rigoroso ao fazer uma única alteração (ou uma única etapa do processamento de dados) que você salve e confirme imediatamente. Não quero incluir uma observação sobre como processar o R ​​(como é o meu idioma preferido) usando um script. É assim que eu trabalho com colegas de dados que me enviam; Talvez eu dê uma olhada rápida em uma planilha, leia o csv no R e escreva um script que inclua todas as etapas de processamento de dados que preciso aplicar. Depois, comento esse script para ter um registro do que fiz e por que o fiz e não alterei o arquivo de dados original.
Reinstate Monica - G. Simpson
@ Jeromy: ponto justo sobre os avisos. Há muito que os filtrava como barulho, para que não me incomodassem. Acabei de testar o Gnumeric e o OpenOffice.org e eles convertem um csv com 12/3 em datas automagicamente - isso é besteira! Então eu entendo o que você quer dizer. A única maneira de interromper isso seria armazenar esses dados como texto e forçar esse tipo de dados no carregamento / importação.
Reinstate Monica - G. Simpson
@ Jeromy: re: perdendo a formatação numérica - sim, sim, a menos que você especifique o tipo de coluna como "numérico" (Gnumérico) ou "texto" em (OpenOffice.org) na importação. Melhor seria para armazená-lo como texto (ver minha resposta editado) para evitar a conversão - você ainda precisará especificar o tipo de dados na importação ...
Reintegrar Monica - G. Simpson
3

Sugiro que você veja o google refine (http://code.google.com/p/google-refine/). Eu acho que é uma ferramenta muito boa para editar arquivos CSV


fonte
Você poderia explicar como isso responde à solicitação de uma estratégia na pergunta?
whuber
3

Eu evitaria trabalhar com os arquivos CSV e TSV todos juntos. Em vez disso, aprenda a usar SQL e opere apenas em uma cópia de dados ou banco de dados (DB) dos seus dados ou use SAS ou R com uma conexão intermediária ao banco de dados. Dessa forma, você pode fazer atualizações em massa de seus dados em vez de encontrar e substituir o temido no Excel (ou qualquer outro programa de planilha que esteja usando) ou copiar e colar, o que pode estar sujeito a erros. A vantagem de usar um sistema de banco de dados também é que você pode habilitar o log e reverter rapidamente as alterações feitas, se forem feitas com erro e todas as alterações puderem ser auditadas. Além disso, restrições de integridade podem ser colocadas em suas tabelas de banco de dados para garantir que você não atualize ou altere erroneamente variáveis ​​/ colunas da maneira que considerar inadequada (por exemplo, datas permanecem como datas e outras informações são do tipo apropriado). Eu venci'

Se você gosta de planilhas porque, de alguma forma, facilita sua entrada de dados, isso pode ser superado em todos os bancos de dados que já usei usando as ferramentas de interface gráfica do usuário / IDEs que acompanham os bancos de dados (por exemplo, Microsoft's Management Studio) ou puxando uma versão vinculada do seu banco de dados em um sistema projetado especificamente para inserir seus dados e impor restrições de dados (por exemplo, formulários de tabelas vinculadas no Access ou uma interface da web personalizada). Você também pode usar outros programas que permitirão obter o melhor dos dois mundos e atualizar dados no Excel e fazer com que essas alterações sejam propagadas para o seu banco de dados (consulte https://www.youtube.com/watch?v=5iyuF_mDSac, por exemplo) .

Estatísticas
fonte
2

Depois que fiz essa pergunta, comecei a dar uma olhada no CSVed .

A partir do site:

CSVed é um editor de arquivos CSV fácil e poderoso, você pode manipular qualquer arquivo CSV, separado com qualquer separador.

Não tenho certeza se alguém tem experiência com isso.

Jeromy Anglim
fonte
Eu tentei instalá-lo. Após uma rápida tentativa, parecia lixo para entrada de dados; talvez, se eu tentasse mais, pudesse descobrir como usá-lo de maneira eficaz, mas suspeito que não.
22410 russellpierce
Você poderia explicar como isso responde à solicitação de uma estratégia na pergunta?
whuber
2

O Excel não é muito compatível com CSV. Por exemplo, se você digitar "1.300" no Excel e salvá-lo como um valor separado por vírgula, isso permitiria! Isso pode ser um grande problema (eu o encontro regularmente ao receber arquivos de outras pessoas).

Eu pessoalmente uso o OpenOffice.org Calc, também uso muitas das soluções listadas acima, mas muitas delas não possuem a funcionalidade e a facilidade de uso necessárias para a edição regular. O OOO Calc é muito mais inteligente que o Excel, embora seja um programa de planilha, você ainda precisará inserir "= 12/3" em vez de "12/3", caso contrário, você estará inserindo um valor, e não um cálculo.

Dê um giro, você não ficará desapontado.

Adão
fonte
1

Eu gosto do Gnumeric porque ele não tenta ser tão resistente a idiotas quanto outros (não grita sobre perda de funcionalidade) e funciona com grandes dados ... mas acho que é apenas para Linux.


fonte
1
Após esta pergunta, fiz uma busca: existe uma versão do Windows projects.gnome.org/gnumeric/downloads.shtml
Jeromy Anglim
1
ele avisa sobre salvar apenas a planilha atual (que era um dos bichos de Jeromy) e possui o recurso irritante de converter numéricos 12/3 salvos corretamente em datas, a menos que você especifique manualmente que eles são numéricos na importação (Dados> Obter Dados externos> Importar arquivo de texto ...) não são carregados.
Reinstate Monica - G. Simpson
Você poderia explicar como isso responde à solicitação de uma estratégia na pergunta?
whuber
1

Basta usar o Editor do Ron . É como o Excel sem a 'ajuda'.

Do site:

O Editor de Ron é um poderoso editor de texto tabular ou CSV. Ele pode abrir qualquer formato de texto separado, incluindo os arquivos separados por vírgula e tabulação padrão (CSV e TSV), e permite controle total sobre seu conteúdo e estrutura.

Não apenas os arquivos de texto tabular podem ser editados, mas também podem ser facilmente filtrados e resumidos em quantas visualizações extras forem necessárias, adicionando uma poderosa funcionalidade de análise.

  • Licença: Gratuito para uso / avaliação pessoal
  • Executa: Windows 32/64 bits 2000 / XP / 2003 / Vista /
Aaron Stewart
fonte
Você poderia explicar como isso responde à solicitação de uma estratégia na pergunta?
whuber
1

Pessoalmente, gosto de usar a idéia de "banco de dados relacional" para gerenciar arquivos CSV. Os arquivos CSV são bons para troca de dados, mas não contêm lógica comercial. Minha experiência de trabalhar com CSV é "existem muitas iterações com os negócios para refinar a análise". Trabalhar apenas com arquivos de texto sem formatação (CSV) apresentará muitos desafios. Por exemplo, o arquivo CSV não mostrará "o que torna os dados exclusivos", ou seja, qual é a "chave primária de cada linha". Isso causará grandes problemas mais tarde, quando tivermos outra fonte de dados para ingressar.

O SQLite é uma boa ferramenta para transformar CSV em banco de dados relacional e, semelhante ao CSV, é fácil de trocar e não é necessária nenhuma configuração de servidor. Mais importante, ele suportava muito bem o Rsoftware estatístico e outros.

Minha estratégia é sempre manter "dados limpos" no banco de dados relacional. E mantenha-o claro na chave primária de cada tabela.

Aqui está um exemplo do que pode acontecer em palavras reais (suponha que estamos vendendo livros):

  • Dia 1, recebi um arquivo CSV que contém todas as informações do cliente.
  • No dia 2, recebi outro arquivo CSV que contém todas as informações do produto (livro). Por alguma razão, as empresas disseram que não há ISBN disponível e a combinação de nome do livro e nome do autor é a chave principal.
  • No dia 3, a edição de livro encontrada pelos negócios precisa ser contabilizada; eles enviam outro CSV para "substituir" o CSV do dia2.
  • Dia 4, as informações de clientes encontradas nos negócios podem ser atualizadas (como alteração de endereço); elas enviam uma versão atualizada das informações do cliente.

Agora, você pode ver a vantagem dos dados limpos e mantê-los no banco de dados relacional. Com a palavra-chave ID do cliente como chave primária e nome do livro, autor e edição como chave primária. É muito fácil fazer atualizações de dados e incorporar alterações conforme necessário. Além disso, a chave primária também fornece "restrições" e "verificação de integridade" para novos dados futuros.

Haitao Du
fonte
0

Se você usar o recurso "Importar dados" do Excel, você terá a opção de selecionar o tipo de dados para cada coluna. Você pode selecionar todas as colunas e usar o tipo de dados "Texto".

quadrado
fonte
Você poderia explicar como isso responde à solicitação de uma estratégia na pergunta?
whuber