1

次のデータセットを読み込もうとしています:

アフガニスタン、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、red、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一度に全回線で使用できないようですので、特に必要です。

4

1 に答える 1

6

ほとんど何でも可能です、あなたはただあなたの目標を正確に定義する必要があります。

データベースがテキストファイルとして保存されていると仮定すると、を使用してデータベースを1行ずつ解析し、数値フィールドのみをフィルタリングするようtextreadに適用できregexpます(これには列に関する事前の知識は必要ありません)。

C = textread('database.txt', '%s', 'delimiter', '\n');
C = cellfun(@(x)regexp(x, '\d+', 'match'), C, 'Uniform', false);

ここでの結果は、文字列のセル配列のセル配列です。各文字列は、特定の行の数値フィールドに対応します。

数値はまだ文字列として保存されているため、おそらく実際の数値に変換する必要があります。これを行う方法は多数ありますがstr2num、トリッキーな方法で使用できます。区切り文字列を数値の配列に変換できます。つまり、特定の行のすべての文字列を1つの文字列に連結し、その間にスペースを入れると、次str2numのようにすべての文字列に一度に適用できます。

C = cellfun(@(x)str2num(sprintf('%s ', x{:})), C, 'Uniform', false);

結果Cは、ベクトルのセル配列になります。各ベクトルには、対応する行のすべての数値フィールドの値が含まれます。特定のベクトルにアクセスするには、中括弧({})を使用できます。たとえば、2行目の番号にアクセスするには、を使用しますC{2}

All the non-numerical fields are discarded in the process of parsing, of course. If you want to keep them as well, you should use a different regular expression with regexp.

Good luck!

于 2013-01-13T11:57:45.827 に答える