- 締切済み
ファイル処理について
下記で1データとして、そのデータが1万個くらいあるのですが、 このデータでは『41.8037834』の部分の値の上限と下限を指定して、 その範囲内データだけを抜き出し、抜き出したデータを新規ファイルに保存するプログラムを 作成中なのですが、データを読み込む部分で、つまづいてしまいました。 どなたかよろしくお願いします 105 4 18 22 10 55 25 300001 1 0.000 0.000 32.920 9.400 -25.60 -52.60 -2.70 -2.40 0.00 0.00 0.00 0.00 6.55 5.05 5.94 5.51 30581507.37 6086402.72 -623434.83 203142.10 655696.35 41.8037834 140.7141167 -23.10 -41.12 30581507.4 46510538.0 24324613.6 19914382.8 0.0 0.0 0.0 0.0 0.00 0.00 72 cm BT dB 0.45 0.042 12.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647 16.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647 20.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647 24.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647 28.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647 32.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647 36.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647 40.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647 44.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647 48.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647 52.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647 56.37 -32768 -32768 -32768 -32768 -32768 -32768 255 255 255 255 0 2147483647
- みんなの回答 (7)
- 専門家の回答
みんなの回答
Dim i '変数iを宣言します Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Const ForReading = 1, ForWriting = 2 Set objInput = objFSO.OpenTextFile("test.txt", ForReading) ' test.txtを読み取りモードで開く Set objOutput = objFSO.OpenTextFile("result.csv", ForWriting, True) ' result.csvを書き込みモードで開く Do Until objInput.AtEndOfStream ' 入力ファイルの終端まで繰り返し strLine = "" For i = 1 To 18 Step 1 strLine = strLine & objInput.ReadLine & "," ' 入力ファイルを1行読み込む Next strLine = Replace(strLine," ",",") objOutput.WriteLine strLine ' 出力ファイルに書き出す Loop objInput.Close objOutput.Close MsgBox "処理終了" ---------------------------------------------------------- それと、もうひとつ VBScript 対象のファイルを(.csv)の形にします。
Dim i '変数を宣言します Dim t Dim strLine(17) Dim aryStrings Dim m1,m2 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Const ForReading = 1, ForWriting = 2 ' test.txtを読み取りモードで開く :注意1 Set objInput = objFSO.OpenTextFile("test.txt", ForReading) ' result.txtを書き込みモードで開く Set objOutput = objFSO.OpenTextFile("result.txt", ForWriting, True) m1 = 0 m2 = 0 underS = CDbl(InputBox("下限の数値を入力して下さい")) upperS = CDbl(InputBox("上限の数値を入力して下さい")) ' 入力ファイルの終端まで繰り返し Do Until objInput.AtEndOfStream ' 入力ファイルを18行読み込む For i = 0 to 17 Step 1 strLine(i) = objInput.ReadLine Next m1 = m1 + 1 '入力レコード数を数える '4行目の先頭を数値化します aryStrings = Split(strLine(3), " ") t = CDbl(aryStrings(0)) 'もし条件が合えば '18行 出力ファイルに書き出す If upperS > t And t > underS Then For i = 0 to 17 Step 1 objOutput.WriteLine strLine(i) Next m2 = m2 + 1 '出力レコード数を数える End If Loop '確認用で本当は要らない(5行) objOutput.WriteLine "-------------------------------" objOutput.WriteLine "上限の数値 = " & upperS objOutput.WriteLine "下限の数値 = " & underS objOutput.WriteLine "入力レコード数 = " & m1 objOutput.WriteLine "出力レコード数 = " & m2 objInput.Close objOutput.Close MsgBox "処理終了" -------------------------------------------------- VBScriptで作ってみましたよ。 注意1 の test.txt を対象のファイル名にしてください。 Dim i から MsgBox "処理終了" までコピーして (.vbs)の拡張子で保存して、同じフォルダーに入れて ダブルクリックで実行 必ず対象のファイルは18の倍数の行でないといけません。 それと目的どうり処理されるか確認してください。
- NOBNNN
- ベストアンサー率50% (93/186)
◆ANo.4の訂正 行番号は 18行でしたね。ANo.4では13行と書いていました。 訂正願います。
- NOBNNN
- ベストアンサー率50% (93/186)
データセットは 1行目13個 2行目12個 3行目5個 4行目5個 5行目9個 6行目6個 7~18行目13個 ですが このままですとデータセットはいちいちレコード数を数えないと抜き出すことができません。 A-No3.のkhazad-leftysさんも書いていますが配列もしくはMDBあるいは ADOの処理にて同じことをする必要があります。 ただし不正なデータセットがあると、このルールはすべて狂う可能性があります。 できれば何かデータセット単位のはじめと終わりの区別があれば大丈夫ですが #Start→ #End といった記号のついたダミーのレコードがあればできますが・・・ もし、13行未満のあるいは14行以上レコード数が混ざっていた場合は 判断ができなくなってしまうからです。 このデータの先頭カラムにデータセット番号を付加したほうが 簡単にできます。 案としては次のようなルールをと行番号を付加します。 7桁として以下の通りとすればできます。 VVVV-XXX (データセット番号、行番号) XXX は 001~013の行番号、VVVVは 0001~からのデータセット(XXXが001~013)単位 の通し番号。 あとは ANo.2 に書いた方法で SQL文のSELECT で以下のようにすればできます。 ___________________________________________________________________________ 【サンプルのSELECT】 Select InDATA.* FROM 入力データ AS InDATA Inner join (SELECT A_DATA.* from 入力データ As A_DATA Where A_DATA.行番号 = "004" AND A_DATA.4行目の1個目のデータ Between 範囲1 and 範囲2) as 抽出条件データ On KEY InDATA.データセット番号 = 抽出条件データ.データセット番号 ____________________________________________________________________________________ このSELECTの条件の意味は 抽出条件データで条件に合致したデータと同じデータセット番号の 全データを抽出しなさいということです。 なお、実際のコーディングとはことなるので コーディングする場合はFRom句のテーブル名は 実際のものと置き換えてください。 ________________________________________________________________________________________ 今回は ANo.2 に書いていますが スペース区切りの CSVデータとしてSchima.INI を定義すれば 大丈夫です。 ◆ 丸投げについて 実際のコーディングを書いてしまうと丸々プログラムを書かなければならなくなってしまうため ご自分で調べてください。 その上の質問ならお答えできます。 以上 ____________________________________________________________________________________
- khazad-lefty
- ベストアンサー率44% (296/668)
*string 形式の配列を用意する。 *とりあえず18行読み込んで、その配列に格納。 *配列から「4行目のデータ」を取得、条件判定。 *当てはまれば、配列のデータを出力。 *配列をクリア。また18行読み込む の繰り返しでいけるのでは?
- NOBNNN
- ベストアンサー率50% (93/186)
>>下記で1データとして、そのデータが1万個くらいあるのですが、 ・1万個というのはどういう書式なのでしょうか? ・CSV(カンマ区切り)OR TAB区切り? ・一行は12個なのでですか? ・どういう言語あるいはEXCELなど、方法がわかりません。 __________________________________________________ 質問の内容があまり具体的ではありませんので ポイントのみお答えします。 条件として以下を採用とした場合の方法で行います。 【条件】 (1)TABまたはスペース区切りのCSVファイル (2)書式は 1行12個の項目 (3)方法はWSHスクリプトで記述されたVBS で行う。 【参考】 ◆WSHスクリプトからのファイル操作 http://www.atmarkit.co.jp/fwin2k/operation/wsh10/wsh10_01.html ◆CSVファイルをADOを用いてクエリにて抽出する。 http://tuka.s12.xrea.com/index.xcg?p=ADO#p10 ___________________________________ 参考のHPをみて作成してみてください。 Schima.ini にて書式を定義し、後は SQL文の SELECT にて項目をWhere で範囲選択(Between)で抽出すればできます。 EXCELでは 65536行以内ならVBAもしくはマクロでできるとはおもいますが この方法なら制限はありません。 Accessをお持ちなら同じことをインポートすれば可能だと思います。 以上
- chibita_papa
- ベストアンサー率60% (127/209)
>データを読み込む部分で、つまづいてしまいました どうつまづいたのがコードを示していただけませんか >このデータでは『41.8037834』の部分 部分とは最初のスペースがあるまでを言っているのでしょうか。 意味が良く分かりません。 VBのバージョンは、 VB6 or VB2005(VB.net)
補足
chibita_papaさん、NOBNNNさん回答ありがとうございます。 説明不足ですみません。 ・バージョンはVB6になります。 ・データファイルは、テキストデータです。 ・データの個数は以下のようになってます。 1行目13個 2行目12個 3行目5個 4行目5個 5行目9個 6行目6個 7~18行目13個 ・1~18行目までで1データとして、それが一万個あって、 19行目から1行目と同じようにすぐに次のデータが並んでます。 ・区切りはスペースだと思います。(タブではない) ・行数は、18行×1万個で18万行になります。 ・抽出条件は、4行目の1個目のデータがある範囲内ならそのデータ全部(18行)を抜き出す