Импортируйте csv, в котором в качестве десятичного разделителя используются числа с запятой.

У меня есть файл csv размером 5 ГБ, импорт которого в stata занимает больше часа.

Причина, помимо прочего, в том, что он имеет европейский формат, то есть это файл, разделенный ;, а числовые столбцы имеют , в качестве десятичного разделителя. Например:

V1  V2   V3
A   2,4  10,1
B   30   1,4

Проблема в том, что stata предполагает, что числовые столбцы являются строковыми переменными, поэтому пытается импортировать их действительно неэффективным способом (попытка объявить столбцы числовыми просто дает мне пропущенные значения).

Есть ли команда/опция, в которой я ввожу другой разделитель десятичной точки, чтобы процесс импорта проходил быстрее?


person Felipe Alvarenga    schedule 25.04.2018    source источник
comment
Вы нашли способ сделать это за один шаг?   -  person    schedule 01.06.2018
comment
Нет, я пытался написать по электронной почте команде разработчиков Stata, но просить о чем-либо очень бюрократический процесс. Мой вывод пока таков, что для существующих версий это невозможно сделать без изменения исходного кода для импорта файлов excel.   -  person Felipe Alvarenga    schedule 01.06.2018


Ответы (2)


Я думаю, что функциональность, которую вы ищете, была добавлена ​​​​в Stata 16. Команда import delimited имеет новые параметры parselocale(), groupseparator() и decimalseparator().

См. 10/c из раздела whatsnew15to16 ниже:

help whatsnew15to16
  1. import delimited — это существующая команда для импорта данных из текстовых файлов с разделителями. Он был улучшен.

    а. Это быстрее. Обычно это на 10% быстрее, а в некоторых случаях — в 2–4 раза быстрее.

    б. Он лучше определяет разделители. В дополнение к запятым и табуляциям теперь он обнаруживает вертикальные черты, двоеточия и точки с запятой.

    в. Новые параметры позволяют выполнять числовой анализ в зависимости от локали. Возможные варианты: parselocale(), groupseparator() и decimalseparator().

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

Для данных:

A; 2,4; 10,1  
B; 30; 1,4

Вы можете сделать следующее:

import delimited "D:\data.csv", varnames(nonames) parselocale(es_ES)

or

import delimited "D:\data.csv", varnames(nonames) groupseparator(.) decimalseparator(,) 
list

     +-----------------+
     | v1    v2     v3 |
     |-----------------|
  1. |  A   2.4   10.1 |
  2. |  B    30    1.4 |
     +-----------------+

describe

    Contains data
      obs:             2                          
     vars:             3                          
    --------------------------------------------------------------------------------
                  storage   display    value
    variable name   type    format     label      variable label
    --------------------------------------------------------------------------------
    v1              str1    %9s                   
    v2              float   %8.0g                 
    v3              float   %9.0g   


person user3396583    schedule 27.06.2019
comment
Спасибо, но странно, что для такого простого и необходимого изменения потребовалось так много времени. - person Felipe Alvarenga; 28.06.2019

Если ваш файл данных выглядит так:

A; 2,4; 10,1  
B; 30; 1,4

Вы можете сделать следующее:

import delimited whatever_filename.txt, delimiters(";") varnames(nonames)
destring v2 v3, dpcomma replace

list

   +-----------------+
   | v1    v2     v3 |
   |-----------------|
1. |  A   2.4   10.1 |
2. |  B    30    1.4 |
   +-----------------+

Начиная с Stata версии 15, нет способа сделать это за один шаг. Я думаю, что единственное другое решение - предварительно обработать файл данных, изменив запятую на точку. Excel может сделать это легко.

person Community    schedule 25.04.2018
comment
Да, это главная проблема, сделать это за один шаг. Моя проблема заключается в вашей первой строке, которая импортирует V2 и V3 в виде строк, что делает способ импорта неэффективным. - person Felipe Alvarenga; 25.04.2018
comment
Вы можете придраться к решению, если сможете придумать лучшее! - person Nick Cox; 25.04.2018