Загрузка набора данных, содержащего как строки, так и номер
Я пытаюсь загрузить следующий набор данных:
Афганистан,5,1,648,16,10,2,0,3,5,1,1,0,1,1,1,0, зеленый, 0,0,0,0,1,0,0,1, 0,0, черный, зеленый
Албания,3,1,29,3,6,6,0,0,3,1,0,0,1,0,1,0, красный, 0,0,0,0,1,0,0, 0,1,0, красный, красный
Алжир,4,1,2388,20,8,2,2,0,3,1,1,0,0,1,0,0, зеленый, 0,0,0,0,1,1,0, 0,0,0, зеленый, белый
...
Проблема в том, что он содержит как целые числа, так и строки. Я нашел некоторую информацию о том, как получить только целые числа. Но я не смог увидеть, есть ли способ получить все данные.
Мой вопрос, это возможно?
Если это невозможно, то есть ли способ найти числа в каждой строке и выбросить все остальное, не выбирая столбцы?
Мне нужно конкретно, так как кажется, я не могу использовать str2num
по всей линии за раз.
1 ответ
Почти все возможно, вы просто должны точно определить свою цель.
Предполагая, что ваша база данных хранится в виде текстового файла, вы можете анализировать ее построчно, используя textread
, а затем применить regexp
чтобы отфильтровать только числовые поля (это не требует наличия предварительных знаний о столбцах):
C = textread('database.txt', '%s', 'delimiter', '\n');
C = cellfun(@(x)regexp(x, '\d+', 'match'), C, 'Uniform', false);
Результатом здесь является массив ячеек из массива ячеек строк, где каждая строка соответствует числовому полю в конкретной строке.
Поскольку числа по-прежнему хранятся в виде строк, вам, вероятно, потребуется преобразовать их в фактические числовые значения. Есть множество способов сделать это, но вы можете использовать str2num
хитрым способом: он может конвертировать строки с разделителями в массив чисел. Это означает, что если вы объединяете все строки определенной строки обратно в одну строку и ставите пробелы между ними, вы можете применить str2num
на всех них сразу, вот так:
C = cellfun(@(x)str2num(sprintf('%s ', x{:})), C, 'Uniform', false);
Результирующий C
представляет собой массив ячеек векторов, каждый из которых содержит значения всех числовых полей в соответствующей строке. Чтобы получить доступ к определенному вектору, вы можете использовать фигурные скобки ({}
). Например, для доступа к номерам второй строки, вы должны использовать C{2}
,
Конечно, все нечисловые поля отбрасываются в процессе разбора. Если вы хотите сохранить их, вы должны использовать другое регулярное выражение с regexp
,
Удачи!