HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0205
MSTいくつかのCSVを読み込んで1つのファイルにデータを入れていきたいです6解決


MST

リンク

2018/2/5(Mon) 13:58:28|NO.82405

教えて頂きたいです。

毎日CSVファイルが、
name,d,d2,f,f2,備考,日付
type2-1,100,7000,336,42.8,1回目,2/5
type2-2,100,7000,347,44.2,2回目,2/5
のような形で出てきます。

これのtype2-1,100,7000,336,42.8,1回目,2/5の部分をデータ分だけ読み込んで、
出力したいです。

また出力したファイルは日々増えたデータを読み込み
追加データを増やせるようにしたいです。
例えば2/5の出力したファイルに2/6に作ったファイルを読み込み
2/5の下に2/6のデータが出るようにしたいです。

出力ファイル
type2-1,100,7000,336,42.8,1回目,2/5
type2-2,100,7000,347,44.2,2回目,2/5
type2-1,100,7000,336,42.8,1回目,2/6
type2-2,100,7000,347,44.2,2回目,2/6

是非ご教授頂けないでしょうか、よろしくお願いします。



この記事に返信する


あまら

リンク

2018/2/5(Mon) 17:31:51|NO.82406

元々あるCSVファイル(以下 元ファイル)から
1行分だけ取り出して、それを【ファイル】に出力(以下 1行ファイル)
更に複数の元ファイルを連結してファイルに出力(以下 連結ファイル)
ということでしょうか?

そうであればCSVとか関係なく、複数行の文字列として考えると難しくはありません。
notesel、noteload、noteget、notesaveなどのnote系命令を使うと
楽に行単位でデータを扱うことが可能です。

1行ファイルはnotegetで1行だけ抜き出して保存するだけ。

連結ファイルはdirlistで複数の元ファイル名のリストを作って
notegetとnoteload命令を繰り返してデータを結合し保存するだけ。

元ファイルの一番初めの行が必ず【name,d,d2,f,f2,備考,日付】になる場合は
読み込む度にnotedel 0で最初の行だけ削除すれば余計なデータも入りません。



MST

リンク

2018/2/5(Mon) 18:26:19|NO.82407

あまら さん

ご回答ありがとうございます。大変参考になります。

「連結ファイルはdirlistで複数の元ファイル名のリストを作って
notegetとnoteload命令を繰り返してデータを結合し保存するだけ。」
の部分がどのようにすればよいのかわかりません。

度々すみませんが、教えて頂けないでしょうか。



MST

リンク

2018/2/5(Mon) 19:30:07|NO.82408

読み込めても、出力の時に上書きされたりしてしまいどうしてもうまくできません。
サンプルコードのようなものを書いて頂けないでしょうか?



あまら

リンク

2018/2/5(Mon) 19:38:23|NO.82409

細かく言葉で説明するのが面倒なので、ソースを見てください。
コメントでおおよそわかると思います。
最初の辺りの「連結ファイル名.csv」という部分は自由に変えてください。
//************************************************
// ファイルの連結 totaldata = ""; // 連結したデータの格納用 totalfile = "連結ファイル名.csv"; exist totalfile; if(strsize == -1) { // 連結ファイルがまだ無い場合 eflag = 0; } else { // 連結ファイルが既に存在している場合 eflag = 1; } // csv 全ファイル名リスト 及び ファイル数取得 sdim filelist, 64; dirlist filelist, "*.csv"; // ファイル名リスト filenum = stat; // ファイル数 // 連結ファイルが既にあるならリストから除外 if( eflag ) { notesel filelist; repeat filenum sdim filename, 64; // 変数クリア noteget filename, cnt; // リストから1行ずつ抜き出し if( filename == totalfile ) { notedel cnt; filenum--; break; } loop } // 連結開始 repeat filenum sdim csvdata, 64; // 変数クリア sdim filename, 64; // 変数クリア notesel filelist; noteget filename, cnt; // ファイルリストからファイル名の抜き出し notesel csvdata; noteload filename; // 0行目はいらない?と仮定して削除 notedel 0; if( (cnt != 0) && (cnt != filenum-1) ) { // 最初か終わりのどちらでも無い場合は改行を追加 totaldata += "\n"; } totaldata += csvdata; loop // 連結ファイル出力 notesel totaldata; notesave totalfile; mes "連結終了";
これは既存のファイルに追加するわけではなく、
新しくファイルを作ってその中に連結した内容を保存している形です。
既に連結ファイルがあっても無くても新規作成&(既存なら)上書き保存になります。

連結ファイル名と同名のファイルがあると、そのファイル内容は無視した連結ファイルを
作って上書き保存されてしまうので、ファイル名にはご注意ください。



あまら

リンク

2018/2/5(Mon) 19:43:26|NO.82410

ちなみに1行ファイルがあっても
// 0行目はいらない?と仮定して削除
notedel 0;
この部分で削除され、空データとして扱われるので連結ファイルには入らないはずです。



MST

リンク

2018/2/5(Mon) 19:57:38|NO.82411

あまら さん

ありがとうございます。
実行してみましたら連結されておりました。
ソースを見ながら勉強させて頂きます。

大変助かりました、ありがとうございます。



ONION software Copyright 1997-2018(c) All rights reserved.