Загрузка набора данных, содержащего как строки, так и номер

Я пытаюсь загрузить следующий набор данных:

Афганистан,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,

Удачи!

Другие вопросы по тегам