こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

ファイル処理について

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

投稿日時 - 2007-05-07 12:13:59

QNo.2980230

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.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)の形にします。

投稿日時 - 2007-05-12 13:48:26

ANo.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の倍数の行でないといけません。
それと目的どうり処理されるか確認してください。

投稿日時 - 2007-05-12 13:37:31

ANo.5

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

投稿日時 - 2007-05-09 02:43:36

ANo.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 を定義すれば
大丈夫です。

◆ 丸投げについて
   実際のコーディングを書いてしまうと丸々プログラムを書かなければならなくなってしまうため
   ご自分で調べてください。 その上の質問ならお答えできます。
   
以上   

____________________________________________________________________________________

投稿日時 - 2007-05-09 02:30:17

ANo.3

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

の繰り返しでいけるのでは?

投稿日時 - 2007-05-08 22:37:24

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

以上

投稿日時 - 2007-05-07 22:39:56

補足

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

投稿日時 - 2007-05-08 09:51:03

ANo.1

>データを読み込む部分で、つまづいてしまいました
どうつまづいたのがコードを示していただけませんか

>このデータでは『41.8037834』の部分
部分とは最初のスペースがあるまでを言っているのでしょうか。
意味が良く分かりません。

VBのバージョンは、
VB6 or VB2005(VB.net)

投稿日時 - 2007-05-07 17:09:51

あなたにオススメの質問