MATLAB: импортировать NA как NaN в csvread () [duplicate]

В SQL Server тип данных DATETIME хранится в виде 2 4-байтовых целых чисел, поэтому у них нет определенного форматирования, подобного этому.

Если вы хотите вернуть дату в определенном формате, вам необходимо преобразовать ее в VARCHAR с указанным соответствующим идентификатором формата.

Если у вас есть datetime в VARCHAR и вы хотите сохранить это в поле DATETIME в SQL Server, тогда вы должны убедиться, что передаете это значение SQL в формате, который всегда будет безопасно интерпретировать. например Формат dd / mm / YYYY не является безопасным в зависимости от настроек, его можно рассматривать как mm / dd / yyyy, когда он входит. Безопасные форматы:

  yyyyMMdd yyyy-MM-ddThh:  mi: ss.mmm  

например

  INSERT MyTable (DateField) VALUES ('01 / 10/2010 ') - dd / MM / yyyy не безопасно INSERT MyTable (DateField) VALUES (' 20101001 ') - yyyyMMdd safe [  ! d1] 

Обновление: когда вы выбираете поле DATETIME (GETDATE (), поле, переменная ....), то, что вы видите в SSMS, является форматированным значением, так как это то, что полезно для вас, вместо этого из которого показано, что это фактическое внутреннее представление в 8 байт.

35
задан chappjc 1 March 2014 в 03:41
поделиться

9 ответов

В случае, когда вы знаете, сколько столбцов данных будет в вашем CSV-файле, один простой вызов textscan , подобный Amro, предполагает, что будет вашим лучшим Решение.

Однако, если вы не знаете a priori , сколько столбцов находится в вашем файле, вы можете использовать более общий подход, как я сделал в следующей функции. Я сначала использовал функцию fgetl , чтобы прочитать каждую строку файла в массиве ячеек. Затем я использовал функцию textscan для синтаксического анализа каждой строки в отдельных строках с использованием предопределенного разделителя полей и обработки целочисленных полей как строк на данный момент (их можно преобразовать в числовые значения позже). Вот результирующий код, помещенный в функцию read_mixed_csv:

function lineArray = read_mixed_csv(fileName, delimiter)

  fid = fopen(fileName, 'r');         % Open the file
  lineArray = cell(100, 1);           % Preallocate a cell array (ideally slightly
                                      %   larger than is needed)
  lineIndex = 1;                      % Index of cell to place the next line in
  nextLine = fgetl(fid);              % Read the first line from the file
  while ~isequal(nextLine, -1)        % Loop while not at the end of the file
    lineArray{lineIndex} = nextLine;  % Add the line to the cell array
    lineIndex = lineIndex+1;          % Increment the line index
    nextLine = fgetl(fid);            % Read the next line from the file
  end
  fclose(fid);                        % Close the file

  lineArray = lineArray(1:lineIndex-1);              % Remove empty cells, if needed
  for iLine = 1:lineIndex-1                          % Loop over lines
    lineData = textscan(lineArray{iLine}, '%s', ...  % Read strings
                        'Delimiter', delimiter);
    lineData = lineData{1};                          % Remove cell encapsulation
    if strcmp(lineArray{iLine}(end), delimiter)      % Account for when the line
      lineData{end+1} = '';                          %   ends with a delimiter
    end
    lineArray(iLine, 1:numel(lineData)) = lineData;  % Overwrite line data
  end

end

Запуск этой функции в содержимом образцового файла из вопроса дает следующий результат:

>> data = read_mixed_csv('myfile.csv', ';')

data = 

  Columns 1 through 7

    '04'    'abc'    'def'    'ghj'    'klm'    ''            ''        
    ''      ''       ''       ''       ''       'Test'        'text'    
    ''      ''       ''       ''       ''       'asdfhsdf'    'dsafdsag'

  Columns 8 through 10

    ''          ''    ''
    '0xFF'      ''    ''
    '0x0F0F'    ''    ''

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

>> data(:, 1) = cellfun(@(s) {str2double(s)}, data(:, 1))

data = 

  Columns 1 through 7

    [  4]    'abc'    'def'    'ghj'    'klm'    ''            ''        
    [NaN]    ''       ''       ''       ''       'Test'        'text'    
    [NaN]    ''       ''       ''       ''       'asdfhsdf'    'dsafdsag'

  Columns 8 through 10

    ''          ''    ''
    '0xFF'      ''    ''
    '0x0F0F'    ''    ''

Обратите внимание, что пустые поля приводят к значениям NaN .

51
ответ дан gnovice 16 August 2018 в 02:07
поделиться
  • 1
    См. Также решение @ AndyCampbell ниже для более поздних выпусков Matlab: stackoverflow.com/a/19642332/232610 – Jonas 28 August 2014 в 10:07
  • 2
    Хороший. Textscan не любит пустые входы. Если сканированный файл csv имеет пустые строки, процедура завершается с ошибкой. Я бы посоветовал заменить lineArray = lineArray(1:lineIndex-1); на ind = all(cellfun(@isempty,lineArray),2); lineArray = lineArray(~ind); – Alex 9 February 2016 в 13:57
  • 3
    Вы также можете использовать strsplit() с параметром CollapseDelimiters, установленным на false, чтобы токенизировать каждую строку файла csv. Matlab по умолчанию сворачивает последовательные разделители. Установите значение false, результатом будет следующее: {'' '' '' '' '' 'Test' 'text' '0xFF' '' ''} для команды strsplit(';;;;;Test;text;0xFF;;', ';', 'CollapseDelimiters', false) – Minh Tran 17 July 2017 в 04:30
% Assuming that the dataset is ";"-delimited and each line ends with ";"
fid = fopen('sampledata.csv');
tline = fgetl(fid);
u=sprintf('%c',tline); c=length(u);
id=findstr(u,';'); n=length(id);
data=cell(1,n);
for I=1:n
    if I==1
        data{1,I}=u(1:id(I)-1);
    else
        data{1,I}=u(id(I-1)+1:id(I)-1);
    end
end
ct=1;
while ischar(tline)
    ct=ct+1;
    tline = fgetl(fid);
    u=sprintf('%c',tline);
    id=findstr(u,';');
    if~isempty(id)
        for I=1:n
            if I==1
                data{ct,I}=u(1:id(I)-1);
            else
                data{ct,I}=u(id(I-1)+1:id(I)-1);
            end
        end
    end
end
fclose(fid);
20
ответ дан Amro 16 August 2018 в 02:07
поделиться

В R2013b или более поздней версии вы можете использовать таблицу:

>> table = readtable('myfile.txt','Delimiter',';','ReadVariableNames',false)
>> table = 

    Var1    Var2     Var3     Var4     Var5        Var6          Var7         Var8      Var9    Var10
    ____    _____    _____    _____    _____    __________    __________    ________    ____    _____

      4     'abc'    'def'    'ghj'    'klm'    ''            ''            ''          NaN     NaN  
    NaN     ''       ''       ''       ''       'Test'        'text'        '0xFF'      NaN     NaN  
    NaN     ''       ''       ''       ''       'asdfhsdf'    'dsafdsag'    '0x0F0F'    NaN     NaN  

Здесь больше информации .

14
ответ дан Andy Campbell 16 August 2018 в 02:07
поделиться

Вы пытались использовать функцию CSVIMPORT, найденную в обмене файлами? Я не пробовал это сам, но он утверждает, что обрабатывает все комбинации текста и чисел.

http://www.mathworks.com/matlabcentral/fileexchange/23573-csvimport

6
ответ дан Ghaul 16 August 2018 в 02:07
поделиться

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

textscan()

. Обратите внимание, что вы можете указать формат где вы читаете до максимального количества символов в строке или пока не будет найден разделитель (запятая).

7
ответ дан raina77ow 16 August 2018 в 02:07
поделиться

Я рекомендую посмотреть массив массивов данных.

Массив набора данных - это тип данных, который поставляется со статистическим инструментом. Он специально предназначен для хранения гетерогенных данных в одном контейнере.

Демо-страница Statistics Toolbox содержит пару vidoes, которые показывают некоторые из массивов массивов наборов данных. Первый - «Введение в массивы набора данных». Второй - «Введение в соединения».

http://www.mathworks.com/products/statistics/demos.html

2
ответ дан richard willey 16 August 2018 в 02:07
поделиться
  • 1
    Спасибо за ваш ответ, примеры выглядят очень полезными, но в моем случае у меня нет установленного набора статистики: / – poeschlorn 25 January 2011 в 08:22
  • 2
    См. Мой ответ ниже, если у вас есть R2013b, это решение будет делать это со столом. – Andy Campbell 29 October 2013 в 15:52

В зависимости от формата файла importdata может работать.

Вы можете хранить строки в массиве ячеек. Введите «doc cell» для получения дополнительной информации.

4
ответ дан William Payne 16 August 2018 в 02:07
поделиться
  • 1
    Массив ячейки - это то, что требуется OP. OP может даже хранить целые данные там. – Marm0t 20 January 2011 в 22:52
  • 2
    Привет Уильям, "cell" кажется, очень хорошая структура данных для моей проблемы. Единственное, с чем я не соглашусь, это «importdata», потому что он не читает в пустых ячейках (из моего CSV) в начале строки ... Я получаю только «[1x89 char] & quot; импортирован. – poeschlorn 21 January 2011 в 08:25
20
ответ дан Amro 6 September 2018 в 01:24
поделиться
7
ответ дан raina77ow 6 September 2018 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: