VB5で固定長、可変長の2種類のファイルを読み込み、編集して、またファイルに書き込むという処理を作成します。
固定長は、構造体にしてランダムアクセスによって、一気に読み書きしています。

問題は可変長のときどのようにファイルアクセスをし、読み書きするのがいいのかよくわかりません。
ファイルデータのフォーマットは
項目   属性 
データ長 6バイト
データ  可変
データ長 6バイト
データ2 可変




といくつか可変長のデータが並びます。
バイナリーでアクセスし、1つ1つ区切りながら読み込むしかないのですか?
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

データの間に","(カンマ)などがはいってるなど決ま毎があるのなら



Private Sub subBunkai(ByVal strData As String,_
ByVal strKey As String, _
ByRef strARec As CRT.A_REC_TYPE)

Dim lonLoop As Long

If UBound(Split(strData, strKey)) <= 0 Then
Exit Sub
End If

For lonLoop = 0 To UBound(Split(strData, strKey))
Select Case lonLoop
Case 0
strARec .A= Split(strData, strKey)(lonLoop)
Case 1
strARec .B = Split(strData, strKey)(lonLoop)
Case 2
strARec .C = Split(strData, strKey)(lonLoop)
Case 3
strARec .D = Split(strData, strKey)(lonLoop)
End Select
Next

End Sub

この関数を作成していけます。
strData には呼び元で取得したファイルデータをいれます。
   例:"123,45678,ABC"
strKey には可変長データを区切ってある区切り文字をいれます。
   例:,(カンマ)など

strARec モジュール.BASに作成した構造体です。

参考になるでしょうか?
    • good
    • 0

#1の方の回答にありますSplitはVB6でのみ使用できるかと


思います。

「データ長」というのは何のデータ長なのでしょうか?
可変長のデータの長さなら、MidBでデータを取得すれば良いのではないですか。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q動画の読み込み速度を上げる方法ってありませんか?

現在動画読み込み速度は1秒約100KB(800kbps)です

ファイルやゲームのダウンロードの速度は一秒570~620KB(4.5MB~4.9MB)
プロバイダで契約しているのは5Mbpsです。

なぜ動画の方が遅くなるのでしょうか?
動画がカクカクして見にくいです。(画質を下げろっていう回答はやめてください)
ダウンロード中でもありません。

メモリは8GB
GPUは内臓のでintel HD Graphics3000 を使っています。
CPUはintel corei7 第二世代のを使っています。
OSはwin8.1です。
HDDは750GBあって50GBしかつかってません。

最適化もしました。ブラウザのキャッシュクリアもしました。

Aベストアンサー

驚きの事実 : 相手の送ってくれる以上のモノは受け取れません。

>なぜ動画読み込みのほうが遅いのでしょうか?

動画サイトのサーバーの送り出し速度は1秒約100KB(800kbps)
ファイルサーバーやゲームサーバーの ア ッ プ ロ ー ド の速度は一秒570~620KB(4.5MB~4.9MB)

動画サイトのサーバーの方がそもそも能力が低いか、そのとき混雑していたのでしょう。

自宅--回線--プロバイダ--(インターネット)--各種サーバー
質問者は自分の側の事情しか考えたことないようですが、通信ってのは「相手」の存在するものです。
インターネットの向こう側にあるサーバーの能力・混雑具合はまちまちです。

有料・無料で区別しているところなら、お金払うといいでしょう。

参考URL:https://secure.nicovideo.jp/secure/register?from=header

Qcsvファイルを読み込んでデータベースのデータと比較して異なっていた場

csvファイルを読み込んでデータベースのデータと比較して異なっていた場合は更新するようにしたいと考えています。

csvデータ…10
データベースから取得したデータ…10.0
※比較するテーブルのフィールドのデータ型はFLOAT型です。

文字列を数値変換して比較、またはデータベースから取得したデータを文字列に変換して比較、どっちがいいのでしょうか。
またどのように比較すればいいのでしょうか。

くだらない質問かもしれませんが宜しくお願いします。

Aベストアンサー

No1の方が言いたいこと良くわかります。けして、質問の意味取り違えていませんよ。

>文字列を数値変換して比較、またはデータベースから取得したデータを文字列に変換して比

問題になるのは、対象となるデーターの背景です。何のデーターを対象としているかです。

例えば、計測又は計量したデーター10.10 と10.1 では意味が違いますね。10.10では100分の1まで計測したが100分の1は0だったという意味です。10.1は10分の1までの計測で、100分の1の値は不明と言うことです(又は四捨五入などの圧縮したデーター)。

数値的には同じ10.1ですが、何桁で扱うかが問題になります。DBでデーター型で扱う利点は、このような時に精度をそろえられるところにあります。文字列として扱ってしまうと、余計な(0と言う文字を追加)作業が出てくる場合もあります。

逆にそんなのどうでもいい、と言う場合もたくさんあり、ケースbyケースです。

文字列として"10.10" == "10.1"なるのかと言う問題ですね。これを==で結びたいときは数値として扱うべき、そうでない時は文字列として扱うと簡単です。

と言うことで回答はケースbyケースです。

No1の方が言いたいこと良くわかります。けして、質問の意味取り違えていませんよ。

>文字列を数値変換して比較、またはデータベースから取得したデータを文字列に変換して比

問題になるのは、対象となるデーターの背景です。何のデーターを対象としているかです。

例えば、計測又は計量したデーター10.10 と10.1 では意味が違いますね。10.10では100分の1まで計測したが100分の1は0だったという意味です。10.1は10分の1までの計測で、100分の1の値は不明と言うことです(又は四捨五入などの圧...続きを読む

Qファイル読み込み/書き込み速度を上げるには

下記のようなファイルの読み込み/書き込み処理において、もっと効率よく(速く)読み込み・書き込みをしたい場合どのような工夫をすれば良いでしょうか?

BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("sample2.data"));
BufferedInputStream in = new BufferedInputStream(new FileInputStream("sample1.data"));
int c ;
while((c = in.read()) != -1)
{
out.write(c);
}
in.close();
out.flush();
out.close();

Aベストアンサー

速くなるかどうかは環境によって微妙に違うと思いますが、効率よくやる方法が2つあります。

1. 1バイトづつ読み書きするのではなくて byte[] で1000バイトとかの塊を読んでそのまま塊を書くようにする。(こうすると read, write をする回数が減るので少し速いと思います)。

2. FileInputStream と FileOutputStream のインスタンス双方から getChannel() で java.nio.channels.FileChannel のインスタンスを取り出し、FileOutputStream 側から取り出した FileChannel のインスタンスに対して transferFrom() で FileInputStream 側から取り出した FileChannel のインスタンスを指定する。

例) in は FileInputStream のインスタンス, out が FileOutputStream のインスタンスの場合。

FileChannel fcin = in.getChannel(), fcout = out.getChannel();
fcout.transferFrom(fcin, 0, fcin.size());

速くなるかどうかは環境によって微妙に違うと思いますが、効率よくやる方法が2つあります。

1. 1バイトづつ読み書きするのではなくて byte[] で1000バイトとかの塊を読んでそのまま塊を書くようにする。(こうすると read, write をする回数が減るので少し速いと思います)。

2. FileInputStream と FileOutputStream のインスタンス双方から getChannel() で java.nio.channels.FileChannel のインスタンスを取り出し、FileOutputStream 側から取り出した FileChannel のインスタンスに対して transferFrom()...続きを読む

Q↓の追記(質問:バイナリーの画像データを読み込む。別記の追記)

以下既出の質問です

別記:上記サイベースのDBで10回程度連続でDBを読み込みに行くと
エラーになるのですが、DB上でそのような回数の指定があるのでしょうか?
それとも、ハード的な問題なんでしょうか?いままでそのような経験が
ありましたら対策等教えてください。お願いします!

********これより追記です********************

下のほうの質問で
エラーメッセージは
[sybase][ODBC Driver][Adaptec Anywhre][データベースサーバが接続を
拒否しました。データベースサーバに接続できる限界数を超えています]
というメッセージです。

VB DB ODBC ともにまったくの素人なものでどうかお願いします。

関連URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=265993

Aベストアンサー

サイベースは分からないのですが、メッセージからするとデータベースの閉じ忘れっぽいですね。
ちゃんとクローズしてますでしょうか?

Qプレステ2の読み込み速度について

SCPH-15000→SCPH-79000(90000)は、SONYによると読み込み速度は変わらないとの返答を得たのですが、読み込み速度が速いという噂も聞きました。実際のところどうなのでしょうか?

Aベストアンサー

そうですね。若干早いような気がしますね。基本的にどんどん高性能になってきていますから、読み込み速度、処理能力などよくなってるはずですよ。

QVBにアクセスのデータベースを読み込みたい(変数の定義)

こんにちわM(__)M
VB超初心者です・・・

一度テキストにそってアクセスのデータベースをVBで読み込んで、リストを表示したり・・・データを削除したり・・・といったものを作ったことがあるのですが、だいぶ忘れてしまいました。
(SQLというんでしたっけ?)

読み込んでからの処理はこれからいろいろヘルプなので調べていけば解決すると思うのですが、まず読み込む段階ではじめに変数の定義をしますよね?

どうやらその変数の定義ができていないらしく、「ユーザー型変数の定義がされていません」といったエラーがでます(実行時)

Public wspace As Workspace

のWorkspaceが確かに青くなりません。


以前はこれを解決するために、コンポーネントの追加?みたいのでなにか機能を追加したような気がするのですが(人に聞いてやったのテキストがありません・・・)どの機能を追加したのか、思い出せないのです><


この変数の定義さえできれば後は進んでいけると思いますので、この点だけ教えていただきたいです。
またはアクセスデータベースを読み込む解説みたいのがのっているサイトがありましたら教えていただきたいです。(初心者でも理解できるもので)

よろしくお願いしますM(__)M

こんにちわM(__)M
VB超初心者です・・・

一度テキストにそってアクセスのデータベースをVBで読み込んで、リストを表示したり・・・データを削除したり・・・といったものを作ったことがあるのですが、だいぶ忘れてしまいました。
(SQLというんでしたっけ?)

読み込んでからの処理はこれからいろいろヘルプなので調べていけば解決すると思うのですが、まず読み込む段階ではじめに変数の定義をしますよね?

どうやらその変数の定義ができていないらしく、「ユーザー型変数の定義がされていません」とい...続きを読む

Aベストアンサー

VBのメニューから「プロジェクト」「参照設定」の中から「Microsoft DAO 3.* Object Library」にチェックして「OK」でいいのでは?それから、質問のときは開発環境も記入したほうがいいですよ。

Qパソコンのドライブを購入したのですが、安いためか最大読み込み速度と書き込み速度がCD-Rで24xと記

パソコンのドライブを購入したのですが、安いためか最大読み込み速度と書き込み速度がCD-Rで24xと記載してありました。しかし、自分は48x対応のCDをパソコンにコピーしたいのです。このドライブに自分が持っているCDを挿入しても非対応なのでしょうか?それとも、読み込み速度が遅いだけで、一応対応するのでしょうか?

Aベストアンサー

>読み込み速度が遅いだけで、一応対応するのでしょうか?

結論は、問題なく対応します。
そもそも
>自分は48x対応のCDをパソコンにコピーしたいのです。

読み込みが48x 対応のCDなんて存在しません。
CDの読み込み速度は、乱暴な言い方をすると無限大で、
使用するドライブによって、x倍速の制限がかかります。
48x 対応などの表示は書き込み速度の表示です。

Q桁数を指定してファイルデータを読み込みたい

ファイルの中身は以下のようになっています.
(fortran向けのデータのため桁が指定されています.)

<ファイルの中身>*********************
_______400________10
____4____1
__10.00000___0.00000___0.00000

  …     …     …
************************************
(_は空白と考えてください.)

全て桁を指定しており,右詰で記入されています.

これらをVBで読み込みたいのですが,
たとえば1行目を
input(No,I & J)
と書いても読み込めません.
というところまではわかるのですが…

読み込める方法(記述)があれば教えてください!!
お願いします!!

Aベストアンサー

> 「切り出し」というのはどういう方法ですか?
項目の区切り文字があるようにみえませんのでMidB関数を使用してください。

もともと例示されているレコードフォーマットが不明ですが、以下のようにすることで7項目読みだせます。
ループ制御は考慮してませんのであしからず。
また各項目とも文字型です。数値型への変換は、がんばってくださいね。
MidとMidBの違いなどはヘルプなどで把握してください。

Dim strBuffer As String
Dim nFile As Long

Dim strField1 As String
Dim strField2 As String
Dim strField3 As String
Dim strField4 As String
Dim strField5 As String
Dim strField6 As String
Dim strField7 As String

nFile=FreeFile

Open "C:\TEST.TXT" For Input As #nFile

LineInput #nFile, strBuffer
strField1 = MidB(strBuffer, 1, 10)
strField2 = MidB(strBuffer, 11, 10)

LineInput #nFile, strBuffer
strField3 = MidB(strBuffer, 1, 5)
strField4 = MidB(strBuffer, 6, 5)

LineInput #nFile, strBuffer
strField5 = MidB(strBuffer, 1, 10)
strField6 = MidB(strBuffer, 11, 10)
strField7 = MidB(strBuffer, 21, 10)

Close #nFile

End

実際に試験してないので間違えてたらお許しください。

> 「切り出し」というのはどういう方法ですか?
項目の区切り文字があるようにみえませんのでMidB関数を使用してください。

もともと例示されているレコードフォーマットが不明ですが、以下のようにすることで7項目読みだせます。
ループ制御は考慮してませんのであしからず。
また各項目とも文字型です。数値型への変換は、がんばってくださいね。
MidとMidBの違いなどはヘルプなどで把握してください。

Dim strBuffer As String
Dim nFile As Long

Dim strField1 As String
Dim strFi...続きを読む

Q新旧2台のPCでDVD Decrypterの読み込み速度が違うのはナゼ??

新旧2台のPCがあるのですが…
DVDをDVD Decrypterで読み込まして見ると読み込み速度が3倍ぐらい違います。
しかもスペックが劣る旧型のPCの方が新PCより早いのです。

●旧型 WindowsXP SP2
    Pentium4 3.2G
ドライブ GSA-4163B
DVD-DL 読み込み 2.4X~4X

●新型 WindowsXP SP3
    Quad Q6600 2.4G
ドライブ LH-20A1P
DVD-DL 読み込み 不明

多分、ReadSpeedもLH-20A1Pの方が早いかと…。
DVD Decrypterの設定も両PC共に「デバイス」の「オプション」の読み込み速度を「最大」に設定しています。

こういった環境でDVD-DLを読み込ませると旧型は20分ほどで、
新型は1時間ぐらいかかってしまいます。

これは何故でしょうか??

Aベストアンサー

アプリケーション・プログラム(DVD Decryter)が、

マルチスレッド対応プログラムでないからです。

Qファイルデータを読み込む時に

VB初心者です。
ファイルのデータ-を読み込む時にPurogressBarとStatusBarを使ってデータの処理中です、という感じのを作りたいのですがどのようにすればよいのでしょうか?やはり関数みたいなのを作ってやって処理した方がよろしいのでしょうか?
ご意見よろしくお願いします。

Aベストアンサー

こんにちは。でっかいファイルの処理などでしょうか?
プログレスバーについてです。

1.メニューのプロジェクト→コンポーネントで「Microsoft Windows Common Controls」にチェックを入れる。

2.プログレスバー・コントロールををツールボックスからフォームに貼り付ける。
 プロパティのVisibleはFalseにしておいたほうがいいかも。

3.ロジックを追加

*ファイルのオープン前

'# ファイルszFileNameのサイズを最大値として使う
ProgressBar1.Max = FileLen( szFileName )
ProgressBar1.Visible = True

*処理の途中

ProgressBar1.Max = (経過)
・経過の数値は、読み込んだバイト数を積算するようにしています
・バイト数は「LenB( StrConv(szGyou, vbFromUnicode) )」でないと誤差が出ます(VB6)。

*処理が終わったとき

ProgressBar1.Max = FileLen( szFileName ) '# 不要かも
ProgressBar1.Visible = False

こんなことで済ませてます。
では!

こんにちは。でっかいファイルの処理などでしょうか?
プログレスバーについてです。

1.メニューのプロジェクト→コンポーネントで「Microsoft Windows Common Controls」にチェックを入れる。

2.プログレスバー・コントロールををツールボックスからフォームに貼り付ける。
 プロパティのVisibleはFalseにしておいたほうがいいかも。

3.ロジックを追加

*ファイルのオープン前

'# ファイルszFileNameのサイズを最大値として使う
ProgressBar1.Max = FileLen( szFileName )
ProgressBar1.Visib...続きを読む


人気Q&Aランキング

おすすめ情報