2016-08-01 13 views
0

私は300バイトのアスキーファイルを9列のデータ(タブ区切りの文字列と数字)で持っています。matlabにASCIIファイルをロードし、それらを.matとして保存する

11204226 736539.402697000 192.168.0.104 10.0324 0 1.1313 3.543 3 9

ファイルがよく構造化され、空の行または不良行が存在しないはずである:例ラインは以下の通りです。形式はファイル全体で同じままです。
私はUbuntu 14.04でファイルを読み込み(importdata)しようとします。 LTS、6GBのRAM、Matlab 2015bシステムはただ止まります。私の同僚は、Windows 7、8GB RAM、Matlab 2014bにファイルを正常にロードしました。

しかし、計画は.matファイルにデータを保存することでしたが、これもできません。ファイルが作成されますが、サイズが1GBを超えて増加し、終了に至る兆候はありません。
Iは、グラフィカルインタフェースまたは以下のコードを介してデータをロードしようとした:.MATファイルを保存

tdata = importdata('data.dat'); 

は、同様のグラフィカルインタフェースを介して試みました。
私は、300MBのファイルがそのような挑戦をしてはならないと考えました。
ファイルへの対処方法はどちらの方法を選択しましたか?
私は、.matファイルがプレーンなasciiファイルよりも小さいと予想しました。
私の計画は、元のファイルを小さな断片に分割することを避けることでした。

更新:
データを読み込めた私の同僚は、構造内のすべての文字列エントリを数値に変換しました。これは最初の3つの列でした。 IPアドレスで構成される3番目の列は別として、どうしてそれらが文字列としてインポートされたのかわかりません。すべての数値行列を持つことで、データを保存することができ、結果として得られる.matファイルのサイズは15MBになります。どういうわけか、文字列と数字の混在がすべてを苦しめました。それでも理由は分かりません。

+2

ファイルサイズは問題ではありません。以前は10GBを超えるファイルをロードしていましたが、RAMに収まらない場合でもMatlabはそれをキャッシュします。私が想定している問題はあなたのコードかもしれません - あなたの質問を編集してください。 – GameOfThrows

+2

ほとんどの '自動'インポートルーチンは、第3列(IPアドレス、3つの '.'で区切られた4つの数字、 '数値'標準には対応していません)で苦労したり、異なるタイプのフィールド/カラムがある場合は、['textscan'](http://mathworks.com/help/matlab/ref/textscan.html)を使用してデータをインポートすることをお勧めします。 – Hoki

答えて

0

私は最後のプロジェクトで大きなcsvファイル(約700MB)を開いた。まず最初にxlsreadを使用しましたが、いくつかの制限がありました(ファイルを開くことができないのは、100万行以上のファイルで構成されていますが、この機能には多くの時間が必要です)。だから私は非常に便利なtextscan機能を発見した。あなたの例と同様のデータサンプルとここでは例:

マイCSV例:

11204226 736539.402697001 192.168.0.101 10.0321 1 1.1311 3.543 3 9 
11204333 736539.402697002 192.168.0.102 10.0322 2 1.1312 3.543 3 9 
11204444 736539.402697003 192.168.0.103 10.0323 3 1.1313 3.543 3 9 

マイコード:

fileID = fopen('newfile.csv','r'); 

formatSpec1 = '%f%f%f%f%f%f%f%f%f%f%f'; 
A = textscan(fileID, formatSpec1,'Delimiter',{';'}); 

結果:Aはセル配列です。 Aの各セルには、データの列全体が含まれています。 私たちはIPアドレスのために何ができますか? 私は、例えば、この方法をお勧め:

myip = strcat(num2str(A{3}),'.',num2str(A{4}),'.',num2str(A{5})) 

myip = 

192.168.0.0.101 
192.168.0.0.102 
192.168.0.0.103 

myipはchar型の配列です。 このデータをすべて保存するとどうなりますか? 私たちは、ダブル配列にセル配列に変換し、IP列を削除することができます:今

res = cell2mat(A); 
res(:,3:5) = []; 

割引:それは今便利なデータ型で構成されているのでマットのファイルを使用して

save('test.mat','res','myip') 

は、本当に良いアイデアです、我々は読み込むことができますそれは1クリック(または1行のコマンド)でそれは毎回csvを読むよりはるかに高速です。

+0

ありがとうございました!データを正常に読み込んで.matファイルに保存できました。 – Green

関連する問題