下記で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
A 回答 (7件)
- 最新から表示
- 回答順に表示
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)の形にします。
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の倍数の行でないといけません。
それと目的どうり処理されるか確認してください。
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行読み込む
の繰り返しでいけるのでは?
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 …
◆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さん、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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Googleスプレッドシートで、あるセルの値に応じて行を自動挿入したい 急いでいます! くわしい方、 3 2023/03/06 19:05
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- Excel(エクセル) エクセルの参照について教えてください 1 2022/12/08 16:06
- Excel(エクセル) エクセルのマクロで複数シートを両面印刷するには? 2 2022/12/08 23:23
- 数学 問題文の2の式の判別式をDとして D=9-12a^2=3(3-4a^2)=3(√3-2a)(√3+2 1 2022/08/15 18:14
- 筋トレ・加圧トレーニング 筋トレの頻度について 現在は3分割で週4回を行っています。来年は仕事の関係で週3回の筋トレが限界です 5 2022/03/25 06:44
- Visual Basic(VBA) 任意の置換を互換の積で表すプログラム 4 2022/11/13 19:10
- その他(プログラミング・Web制作) python 3.10で 同じlistに同じ構文で同じデータ代入した結果が異なる現象発生 7 2022/06/18 11:08
- 数学 数式のまとめ方 2 2022/07/27 10:45
- Excel(エクセル) エクセルで年月ごとの売り上げを集計する方法を教えてください 7 2022/06/01 17:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルの特定行を書...
-
2つのCSVファイルをマッチング
-
Perlでバイナリファイルを作成...
-
エクセルVBA コードが同じでも...
-
拡張子 ”log” と ” dat” の違い
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
readdir()で得られるファイル・...
-
fgets で値が取得できない
-
window.open でのファイル指定方法
-
batファイルでrenameができませ...
-
動かなくなったのでJavaソース...
-
Windowsで複数のファイルを同じ...
-
awkスクリプトでダブルクォーテ...
-
全角と半角文字が混在している...
-
cgi.pm を使用してファイルUP時...
-
Pythonで非日本語のUnicode文字...
-
一行だけ読込
-
utf8使用時のフォーム入力文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
ReadLineでの読み出し行を指定する
-
JavaでCSVファイルを高速に読む...
-
MATLAB グローバル変数の宣言
-
エクセルVBA コードが同じでも...
-
Perlの変数に文字数制限(容量...
-
perlで、後ろの行を読んで、前...
-
2つのCSVファイルをマッチング
-
C言語でのファイルのデータ更...
-
VB6.0でDB接続する際に切断時の...
-
CSVが可変長の場合の検索方法
-
perlで容量の大きいCSVファイル...
-
1ファイルずつ読み込みたい
-
VBScriptでファイル保存先のデ...
-
C#でCSVファイルを逐一更新したい
-
perl で googleAPIを呼び出す...
おすすめ情報