2016-08-22 30 views
0

私はテキストファイルを持っています。文字配列をセル配列と行列に分割する

ファイルには、約20,000行のデータがあります。各行には1つの列があります。&は256文字(すべて数字)です。

各行をセル配列またはマトリックスに分割する必要があります。したがって、各8文字は情報の「ワンピース」です。私は最初の3文字をセル配列に分割し、次の5文字を​​ダブルに分割し、次に8文字を同じにしたい。

example 

1653256719812345 

myCellArray (1 x 2)  myDoubleArray (1 x 2) 
[165, 198]    [32567, 12345] 

これを行うにはどのような方法が最適ですか?

+1

例の数値データ・タイプに使用すると、提供された番号を変換するstr2doubleを使用することができるように解析された番号を含むファイルの行であります16文字を表示していますが、8文字にしか見えません。予想される出力形式は何ですか?それは、2次元マトリックスまたはセル配列で、3つの数字、5つの数字、3つの数字、5つの数字などを参照してください。 – rayryeng

+0

申し訳ありませんが、私の出力はあまり明確ではありませんでした。上の例の更新では、1 x 2と1 x 2の2つの配列があることがわかります。それぞれの列が16文字長い50行がある場合、2つの行列は50 x 2になります。 32文字行列は50 x 4になります – mHelpMe

+1

'regexp'を使うと、反復処理を避けることができます。 –

答えて

3

regexpを使用してください。ファイルdata.txt

1653256719812345 
1563256719812345 
1233256719812345 
1463256719812345 

が含まれている場合は、以下のMATLABステートメントは、番号を読み込みます。

>> txt = fileread('data.txt') % Read entire file in txt 
>> out = regexp(txt,'(\d{3})(\d{5})(\d{3})(\d{5})','tokens') % Match regex capturing groups 

out = 

{1x4 cell} {1x4 cell} {1x4 cell} {1x4 cell} 

outにおける各セルはstrings.YouはMATLAB

>> nums = cellfun(@str2double,out,'uni',0) 

nums = 

[1x4 double] [1x4 double] [1x4 double] [1x4 double] 
0

行を1つずつ繰り返し、次のコードのように実行します。

k=int2str(1653256719812345); 
> myCellArray{1}=k(1:3) 

myCellArray = 

    '165' 

>> mydoublearray(1)=str2num(k(4:9)) 

mydoublearray = 

     325671 

数式パターンがある場合は、手動でハードコーディングする代わりにそのパターンを組み込む必要があります。

4

textscanを使用してください。

fid = fopen(MyFileName.txt); 
data = textscan(fid, '%3d%5d', 'Delimiter', ''); 
fclose(fid); 

テスト:

% Test with string of 256 random digits that all happen to be 1:8 repeated 32 times 
x = '1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678'; 

>> y = textscan(x, '%3d%5d', 'Delimiter', '') 
y = 

[32x1 int32] [32x1 int32] 

>> y{1} 
ans = 

    123 
    123 
    123 
    123 
    ... 

あなたがループ内で、このライン・バイ・ラインを行う必要がありので、私はあなたが得ることになる場合には(、あなたのファイルの正確な形式を知りません各行でfgetlを使用し、textscanステートメントのfidfgetlの出力に置き換えます)。

一般に

、あなた自身のtextscan、(固定フィールド幅のテキストファイル)FORTRANコードによって生成されたデータを読み込むために持っ'Delimiter, '''Whitespace', ''パラメータを見つけるたびはあなたの友達です。

+0

のデータが実際には20000 x 1セルとして入力されています。次の行を実行すると、1 x 2の空のセルが返され、何か間違ったことをしていますか? x = textscan(y、 '%3d%5d'); – mHelpMe

+0

2つの可能なこと。まず、 ''デリミタ '' '部分をスキップしました。ここの場合、MATLABは最初の8文字を取り出し、その行の最後である次の区切り文字に移動します。次に、テキストを渡す必要があります。だから、もしあなたがセルを渡すなら、あなたは何も得られません。テキスト配列を取得するには 'y {1}'を渡す必要があります。セル配列の要素がすでに数値である場合、これは全く機能しません。全く異なる問題であるため、質問を書き直す必要があります。 – craigim

+0

は、 'デリミタ'、 ''部分はまだ同じです。データは20,000 x 1セルに収められています。次に、セル配列を20,000 x 256のchar配列に変換します。次にx = textscan(geo、 '%3d%5d'、 'Delimiter'、 '');それはまだ間違っていますか? – mHelpMe

関連する問題