Scilab Home page | Wiki | Bug tracker | Forge | Mailing list archives | ATOMS | File exchange
Please login or create an account
Change language to: English - Français - Português - Русский
Scilabヘルプ >> Spreadsheet > csvRead

csvRead

CSVファイルを読み込む

呼び出し手順

M = csvRead(filename)
M = csvRead(filename, separator)
M = csvRead(filename, separator, decimal)
M = csvRead(filename, separator, decimal, conversion)
M = csvRead(filename, separator, decimal, conversion, substitute)
M = csvRead(filename, separator, decimal, conversion, substitute, regexpcomments, range)
M = csvRead(filename, separator, decimal, conversion, substitute, regexpcomments, range, header)
[M, comments] = csvRead(filename, separator, decimal, conversion, substitute, regexpcomments, range, header)

引数

filename

1行1列の文字列行列で,ファイルパスです.

separator

1行1列の文字列行列で, 使用されるフィールドセパレータ.

decimal

1行1列の文字列行列で,使用される小数点.

decimal[] と異なり conversionstringに 設定された場合,小数点変換が行われます.

conversion

1行1列の文字列行列で,出力Mの型. 利用可能な値は "string" または "double" (デフォルト)です.

read_csv では "string" がデフォルトであることに 注意してください.

substitute

m行2列の文字列行列で, 置換マップ(デフォルト = [], 置換処理なし). 最初の列 substitute(:,1) は 検索する文字列を有し, 2番目の列 substitute(:,2) は置換文字列を 有します. ファイル中に指定された文字列が現れる度に 置換が行われます.

rexgepcomments

文字列: 一致する行を削除するための正規表現. (デフォルト: [])

range

1行4列の浮動小数点の整数行列で, 読み込む列および行の範囲です (デフォルトの範囲は [] で,全ての行と列を意味します). [R1 C1 R2 C2]の形式で範囲を 指定してください. ただし,(R1,C1)は読み込むデータの左上隅, (R2,C2)は右下隅です.

ファイルが正しく整形されていることに注意してください. この範囲はパースされた要素についてメモリ上で実行されます.

header

1行1列の行列の浮動小数点整数, ファイルの先頭で無視される行の数.

M

m行n列の文字列またはdouble行列.

comments

正規表現にマッチしたm行n列の文字列行列.

説明

カンマ区切りの値をフィールドとするアスキーファイルを指定すると, この関数は対応する文字列またはdoubleのScilab行列を返します.

例えば,.csvデータファイルは 表計算ソフトウェアにより"テキスト及びカンマ"形式で 作成されたものとすることができます.

列はカンマ以外で区切られたものとすることもできます. この場合, 別のセパレータを指定する csvRead(filename, separator) を使用してください.

オプションの入力引数のデフォルト値は, csvDefault 関数で定義されます.

オプションの入力引数に空の行列[]を指定すると, デフォルト値が設定されます.

入力引数 "conversion" が "double" の時, .csvの中の数値以外のフィールド(例:文字列)は NaNに変換されます.

csvRead は UTF-8 および ASCII テキストファイルを読み込むことができます.

以下のスクリプトは, csvRead関数のいくつかの基本的な使用例を示します.

// タブ区切りのデータを含むファイルを生成
M = 1:50;
filename = fullfile(TMPDIR, "data.csv");
csvWrite(M, filename, ascii(9), '.');
// csvファイルを読み込む
M1 = csvRead(filename,ascii(9), [], 'string')
// doubleを返す
M2 = csvRead(filename,ascii(9), '.', 'double')
// 元のデータを結果と比較
and(M == M2)
// 特殊なデータファイルを管理するために
// 置換用引数を使用
content = [
"1"
"Not-A-Number"
"2"
"Not-A-Number"
];
substitute = [
"Not-A-Number" "Nan"
];
mputl(content,filename);
M = csvRead(filename,",",".","double",substitute)
isnan(M(2,1)) // Expected=%t
isnan(M(4,1)) // Expected=%t

以下のスクリプトは, csvRead関数のより実用的な使用例を示します.

// 文字列の行列を定義
Astr = [
"1" "8" "15" "22" "29" "36" "43" "50"
"2" "9" "16" "23" "30" "37" "44" "51"
"3" "10" "17" "6+3*I" "31" "38" "45" "52"
"4" "11" "18" "25" "32" "39" "46" "53"
"5" "12" "19" "26" "33" "40" "47" "54"
"6" "13" "20" "27" "34" "41" "48" "55"
"+0" "-0" "Inf" "-Inf" "Nan" "1.D+308" "1.e-308" "1.e-323"
];
// カンマ区切りのデータを有するファイルを作成
filename = fullfile(TMPDIR , 'foo.csv');
sep = ",";
fd = mopen(filename,'wt');
for i = 1 : size(Astr,"r")
        mfprintf(fd,"%s\n",strcat(Astr(i,:),sep));
end
mclose(fd);
// ファイルを参照するには: edit(filename)
// このファイルを読み込む
Bstr = csvRead ( filename )
// 特殊なセパレータを有するファイルを作成: ここでは ";"
filename = fullfile(TMPDIR , 'foo.csv');
sep = ";";
fd = mopen(filename,'wt');
for i = 1 : size(Astr,"r")
        mfprintf(fd,"%s\n",strcat(Astr(i,:),sep));
end
mclose(fd);
//
// セパレータを指定してファイルを読み込む
csvRead ( filename , sep )

以下のスクリプトは csvRead 関数のregexp引数により 行を削除する例を示します.

CSV = ["// tata"; ..
"1,0,0,0,0"; ..
"// titi"; ..
"0,1,0,0,0"; ..
"// toto"; ..
"0,0,1,0,0"; ..
"// tutu"];
filename = fullfile(TMPDIR , 'foo.csv');
mputl(CSV, filename);
// @ で始まる行を削除
[M, comments] = csvRead(filename, [], [], [], [], '/\/\//')

空のフィールドはcsvReadで管理されます

csvWrite(['1','','3';'','','6'], TMPDIR + "/example.csv")
csvRead(TMPDIR + "/example.csv", [], [], "string")
csvRead(TMPDIR + "/example.csv", [], [], "double")
// 文字列の行列を定義
Astr = [
"1" "8" "15" "22" "29" "36" "43" "50"
"2" "9" "16" "23" "30" "37" "44" "51"
"3" "10" "17" "6+3*I" "31" "38" "45" "52"
"4" "11" "18" "25" "32" "39" "46" "53"
"5" "12" "19" "26" "33" "40" "47" "54"
"6" "13" "20" "27" "34" "41" "48" "55"
"+0" "-0" "Inf" "-Inf" "Nan" "1.D+308" "1.e-308" "1.e-323"
];
// カンマ区切りのデータを有するファイルを作成
filename = fullfile(TMPDIR , 'foo.csv');
sep = ",";
fd = mopen(filename,'wt');
for i = 1 : size(Astr,"r")
        mfprintf(fd,"%s\n",strcat(Astr(i,:),sep));
end
mclose(fd);
// ファイルを参照するには: edit(filename)
// このファイルを読み込む
Bstr = csvRead ( filename )
// 特殊なセパレータを有するファイルを作成: ここでは ";"
filename = fullfile(TMPDIR , 'foo.csv');
sep = ";";
fd = mopen(filename,'wt');
for i = 1 : size(Astr,"r")
        mfprintf(fd,"%s\n",strcat(Astr(i,:),sep));
end
mclose(fd);
//
// セパレータを指定してファイルを読み込む
csvRead ( filename , sep )

以下のスクリプトでは, ファイル "filename" は 5000行単位のブロックで読みこまれます. 実際に読み込まれたファイルの行数が5000行に 満たない時, すなわち, ファイルの終端に達した時, このアルゴリズムは中断します.

blocksize = 5000;
C1 = 1;
C2 = 3;
iblock = 1
while (%t)
R1 = (iblock-1) * blocksize + 1;
R2 = blocksize + R1-1;
irange = [R1 C1 R2 C2];
mprintf("Block #%d, rows #%d to #%d\n",iblock,R1,R2);
tic();
M=csvRead(filename , [] , [] , [] , [] , [] , irange );
t = toc();
nrows = size(M,"r");
ncols = size(M,"c");
if ( nrows > 0 ) then
p = t/(nrows*ncols)*1.e6;
mprintf("  Actual #rows=%d\n",nrows);
mprintf("  T=%.3f (s)\n",t);
mprintf("  T=%.1f (ms/cell)\n",p);
end
if ( nrows < blocksize ) then
mprintf("... End of the file.\n");
break
end
iblock = iblock + 1;
end

出力は以下のようになります :

Block #1, rows #1 to #5000
Actual #rows=5000
T=3.135 (s)
T=209.0 (ms/cell)
Block #2, rows #5001 to #10000
Actual #rows=5000
T=3.139 (s)
T=209.3 (ms/cell)
Block #3, rows #10001 to #15000
Actual #rows=5000
T=3.151 (s)
T=210.1 (ms/cell)
etc....
範囲を有する例
CSV = ["1,0,0,0,0"; ..
"0,1,0,0,0"; ..
"0,0,1,0,0"; ..
"4,4,1,2,0"; ..
"4,63,1,2,0"; ..
"4,63,1,4,233"; ..
"42,3,23,2,23"; ..
];
filename = fullfile(TMPDIR , 'foo.csv');
mputl(CSV, filename);
// csvファイルの一部を展開
csvRead(filename, [], [], "double", [], [], [5 3 7 6])
ヘッダを有する例
comments = [
"// Copyright (C) INRIA"];
filename = fullfile(TMPDIR , 'foo.csv');
csvWrite(rand(2,3), filename, ascii(9), ",", [], comments);
header = 2;
[M, c] = csvRead(filename, ascii(9), ",", "double", [], [], [], header) // 最初の2行(ヘッダ)を無視

参照

  • csvTextScan — カンマ区切りの値を行列に変換
  • csvWrite — CSVファイルを書き込む
  • csvDefault — CSVファイルに関するデフォルト動作を取得/設定.

履歴

バージョン記述
5.4.0 関数が導入されました. 'csv_readwrite'モジュールに基づきます. read_csv と比べた場合の 動作の唯一の差異は, read_csvが値を文字列として返す時,デフォルトで値をdoubleに変換しようとする ことです.
5.4.1 decimal[] 以外で, conversionstringに設定された場合, 小数点変換が行われます.
5.5 ヘッダを無視するために,入力引数"header"が追加されました.
Scilab Enterprises
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Thu Feb 14 15:02:37 CET 2019