• 締切済み

ファイル処理について

下記で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

みんなの回答

noname#97729
noname#97729
回答No.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)の形にします。

全文を見る
すると、全ての回答が全文表示されます。
noname#97729
noname#97729
回答No.6

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)
回答No.5

◆ANo.4の訂正 行番号は 18行でしたね。ANo.4では13行と書いていました。  訂正願います。

全文を見る
すると、全ての回答が全文表示されます。
  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.4

データセットは 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 を定義すれば 大丈夫です。 ◆ 丸投げについて    実際のコーディングを書いてしまうと丸々プログラムを書かなければならなくなってしまうため    ご自分で調べてください。 その上の質問ならお答えできます。     以上    ____________________________________________________________________________________

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

*string 形式の配列を用意する。 *とりあえず18行読み込んで、その配列に格納。 *配列から「4行目のデータ」を取得、条件判定。 *当てはまれば、配列のデータを出力。 *配列をクリア。また18行読み込む の繰り返しでいけるのでは?

全文を見る
すると、全ての回答が全文表示されます。
  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.2

>>下記で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をお持ちなら同じことをインポートすれば可能だと思います。 以上

valga
質問者

補足

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行)を抜き出す

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

>データを読み込む部分で、つまづいてしまいました どうつまづいたのがコードを示していただけませんか >このデータでは『41.8037834』の部分 部分とは最初のスペースがあるまでを言っているのでしょうか。 意味が良く分かりません。 VBのバージョンは、 VB6 or VB2005(VB.net)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB6でファイルを開く

    こんにちは。 いま作成中のプログラムなんですが、data.csvというファイルを作って、そのファイルに値をいれていきます。 現在、data.csvはexeファイルのあるフォルダに保存されるようになっています。 このデータを、プログラム中で呼び出して見たいのですが、どうすればよいでしょうか? 第一希望としては、計算処理中に呼び出してExcelに値が入っていくのを見たいです。 が、むりなら計算処理が終了した後でも可です。 よろしくお願いします。

  • X-R管理図についての質問です。

    測定前後(n=2)で管理していますが、例えば、上限が20、下限が10とします。測定前値が21で測定後値が17だとします。Xbarは19で範囲内です。ですが、測定前値が21と上限を超えています。これはOKなのでか?データは単発で出たデータとします。

  • ディレクトリのファイル作成を監視する?

    ディレクトリに、データファイルを保存するプログラムを作成しました(perl)そのディレクトリに出力されたファイルを直後にDB登録したいのですが、どのような方法があるのか?考え中です。イメージですが ディレクトリを監視して、ファイル作成されたらDB登録する。 というようなことが、出来るでしょうか? OSはRedhat DBはpostgresなのですが、いい方法ありましたら、よろしくお願い致します。 そのディレクトリは他のプログラムでも参照してるため、消したり移動出来ない事と、ファイル作成された直後に登録したのです。。

    • ベストアンサー
    • Perl
  • プログラム ファイル処理について

    プログラムの問題が解けなくて困っています。 visual C++ 2010 Express を使用しています。 (1)X,Yの範囲がそれぞれ-200から200の範囲で空間内に立体が書かれる ようにエクセルファイルにデータを入れたいのですが、その処理がうまくいきません。 (2)degreeの意味がわかりません。degree*PI(円周率)/180でradianなのですか? よろしくお願いします。 今、2次元平面上の座標値(x,y)に対し、(x2+y2)0.5を角度(degree) とした場合に、 下記の式によって定義されるポテンシャル値zの分布を考える z=30×(cos(√(x2+y2))+cos((3×√(x2+y2))) xとyの範囲を(-200<X<200)、(-200<Y<200)と設定してXとYの値を10ごとに増加させた場合のZの値を 以下のようなfor文を用いて計算し、 for(y=200.0;y>=-200.0;y=y-10.0){  for(x=-200.0;x<=200.0;x=x+10.0){  } } 同一のY座標値におけるZの値がカンマで区切られて並ぶテキストファイルを出力するプログラムを作成しなさい。 そのファイルをエクセルで開き(カンマ区切りで) 3次元グラフを表示させる. ヒント1: #include <math.h> を宣言することにより、数学関数 cos sin pow が使用可能となる。 ヒント2: sin cos の引数はラジアン単位で指定する必要があるため、円周率を用いて degree から radian を求めること

  • C#のファイル読み込みについて

    Visual C#を使用したプログラムを勉強中です。 今まではCOBOLでの開発しか、経験したことがありません つい先日から勉強を始め、現在ドリル式の参考書を読み終え 各種コントロール、コンポーネント、ダイアログなども ごく簡単なサンプルプログラムを使用して触ってみました。 つぎのステップとして、自作のプログラムを作成してみようと 考えていたのですが、最初の段階で躓いてしまったので 質問させていただきます。 仕様としては、csvファイルにて 「番号,名前,値1,値2,値3」というデータファイルを作成しておき それをアプリケーション起動時に読み込む TextBoxに文字を入力し、検索ボタンを押すことで データファイルの「名前」部分と一致したデータの内容(値1,値2...)を Label、もしくはTextBoxの指定した箇所にそれぞれ表示をさせようと考えています。 こういった仕様のプログラム(というより、C#での考え方)の場合 最初のデータ読み込みの段階で、csvファイルから配列にデータを 読み込んでおくのか、 検索ボタンを押した段階でファイルから読み込み該当項目を探すのか どちらが良いのでしょうか? データ件数が膨大な量でない限り、前者の方法が適しているのではないかとは 考えています。 また、よろしければ簡単にプログラムでの書き方も 併せて教えていただけると、とてもありがたいです・・・ 今現在のスキルとしては、ファイルの読み込みに関してはopenFileDialogを使用して ファイルを指定し、FileStreamを取得、streamReaderで読み込み richTextBoxに表示させる、というような処理しか理解できていません

  • (仮の?)標準偏差の計算方法について

    あるデータで、 上限・下限の範囲のみわかっているータがあります。(n数は不明) 例 下限データ 2.4   上限データ 4.4 この時、平均は(上限+下限)/2     標準偏差(上限ー下限)/4 で良いのでしょうか?(平均はわかるのですが、標準偏差が・・・) 理由もわからず、このように言われたのですが・・・ 説明もわかりずらいと思いますが、補足説明もしますので よろしくお願いします。

  • エクセルVBAでの自動ファイル保存

    エクセルVBAを使い入力したシート(ファイル)を、一定のデータが 入力された時点で指定した場所に例えば作成日をファイル名にして自動 的に保存していくようにしたいのですが、プログラムはどのようにすればいいのでしょうか? 実現させたいプログラムは、このような感じにしたいです。 1.VBAで指定シートにデータ入力→2.データ数10個で自動的に日付をファイル名にして自動的に保存→3.更に、データ10個追加された時点で前に作成されたファイルを自動で更新→4.データの入力完了で更に自動で更新 2~4のプログラムをご教授お願いします。

  • 0バイトファイルの作成

    PRO*Cで、DBから取得した値をCSVファイルに出力するプログラムを 作成しています。 fprintf関数で書込んでいるのですが、 途中でエラーが発生した場合(異常終了)、 今まで書込んでいたデータを残さず、0バイトファイルを 作成する仕様になっているのですが、 単純にファイルポインタにNULLを代入して、 ファイルクローズすればできますか?

  • ファイル出力ついて

    当方、JAVA初心者です。 CSVファイルの出力を行うプログラムを作成しています。 仕様として1行目はヘッダ部分を出力し、 2行目以降にDBの値を出力するCSVファイルを作成しようとしています。 例 (ヘッダ部分)"項目A----","項目B----","項目C----","項目D----" (データ部分)"項目Aの値","項目Bの値","項目Cの値","項目Dの値"             ・             ・ ですが、データ部分の個数が不変になっており、ヘッダ部分がずれてしまいます。 例 項目Cの数が2個ある場合はデータ部分に項目Cの値を2個出力する為、 項目Dのヘッダ部の列の下に項目Cの2個目の値が書き込まれてしまいます。 "項目A----","項目B----","項目C-----","項目D-----" "項目Aの値","項目Bの値","項目Cの値1","項目Cの値2","項目Dの値"             ・             ・ そこで、先にデータ部分の書き込みを行い、それぞれの項目のデータ件数の最大値を保持し、最後にデータ件数の最大値に合わせてヘッダ部分の書き込みを行おうと考えているのですが、 ファイルをopenしなおす方法以外で、 先に2行目以降の書き込みを行い、最後に1行目の書き込みを行う方法がわからなく困っております。 ご回答のほど、宜しくお願いします。

    • ベストアンサー
    • Java
  • MySQLのデータファイルの位置について

    MySQLでテーブル、データベースを作成したのですが、 OS上から作成したテーブル・データベースが保存されているファイル(データファイル?) が見つけられません。 テーブルにデータをインサートしてコミットして、 セレクトを行ってデータは反映されていることは確認しています。 OSはWindows 7 MySQLのバージョンは5.5です。 user_dbというデータベースを作成し、 show databasesを行った結果、 information_schema mysql performance_schema test user_db が表示されることから、データベースuser_dbは正常に作られていると思います、 user_dbに対して、インサートは可能で、一度データベースを停止して、 再起動後、インサートしたデータがみれています。 しかし、インストールフォルダのMy.iniのdatadirで指定されているフォルダには mysql performance_schema のフォルダしかない状態です。(ここにuser_dbフォルダが作成されると思うのですが) どこにデータが保存されているのでしょうか?

    • ベストアンサー
    • MySQL
このQ&Aのポイント
  • iPad 第9世代用の液晶保護フィルムについてを調査しました。
  • エレコム製の保護フィルムについて詳しく知りたい方は必見です。
  • ブルーライトカット率にこだわらず、サラサラ感が欲しい方におすすめです。
回答を見る