Gson легко учиться и реализовывать, что нам нужно знать, следуют двум методам
`
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import com.google.gson.Gson;
public class GsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
try {
BufferedReader br = new BufferedReader(
new FileReader("c:\\file.json"));
//convert the json string back to object
DataObject obj = gson.fromJson(br, DataObject.class);
System.out.println(obj);
} catch (IOException e) {
e.printStackTrace();
}
}
}
`
В случае, когда вы знаете, сколько столбцов данных будет в вашем 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» для получения дополнительной информации.