В 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 байт.
В случае, когда вы знаете, сколько столбцов данных будет в вашем 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
.
% 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);
В 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
Здесь больше информации .
Вы пытались использовать функцию CSVIMPORT, найденную в обмене файлами? Я не пробовал это сам, но он утверждает, что обрабатывает все комбинации текста и чисел.
http://www.mathworks.com/matlabcentral/fileexchange/23573-csvimport
Если ваш входной файл имеет фиксированное количество столбцов, разделенных запятыми, и вы знаете, в каких столбцах это строки, лучше всего использовать функцию
textscan()
. Обратите внимание, что вы можете указать формат где вы читаете до максимального количества символов в строке или пока не будет найден разделитель (запятая).
Я рекомендую посмотреть массив массивов данных.
Массив набора данных - это тип данных, который поставляется со статистическим инструментом. Он специально предназначен для хранения гетерогенных данных в одном контейнере.
Демо-страница Statistics Toolbox содержит пару vidoes, которые показывают некоторые из массивов массивов наборов данных. Первый - «Введение в массивы набора данных». Второй - «Введение в соединения».
В зависимости от формата файла importdata может работать.
Вы можете хранить строки в массиве ячеек. Введите «doc cell» для получения дополнительной информации.
lineArray = lineArray(1:lineIndex-1);
наind = all(cellfun(@isempty,lineArray),2);
lineArray = lineArray(~ind);
– Alex 9 February 2016 в 13:57strsplit()
с параметромCollapseDelimiters
, установленным наfalse
, чтобы токенизировать каждую строку файла csv. Matlab по умолчанию сворачивает последовательные разделители. Установите значение false, результатом будет следующее:{'' '' '' '' '' 'Test' 'text' '0xFF' '' ''}
для командыstrsplit(';;;;;Test;text;0xFF;;', ';', 'CollapseDelimiters', false)
– Minh Tran 17 July 2017 в 04:30