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と関連する良く見られている質問

QTextFieldParserの固定長桁数をバイト単位で指定したい

TextFieldParserによる固定長テキストファイルの読込で、
桁数を文字数ではなく「byte数」で指定する方法を教えてください。
(FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です)
以下に、文字数指定による読込のコードを記述します。
よろしくお願いします。

'VBのコード-----------------------------------------------
  Public Shared Sub Main()
    Using reader As New TextFieldParser("C:\test.txt", Encoding.GetEncoding("SHIFT_JIS"))
      reader.TextFieldType = FieldType.FixedWidth
      reader.SetFieldWidths(2, 7, 2)

      Dim currentFields() As String
      While Not reader.EndOfData
        Try
          currentFields = reader.ReadFields() ' 一行読込
          Dim currentField As String
          For Each currentField In currentFields
            Trace.WriteLine(currentField)
          Next
        Catch ex As MalformedLineException
          MessageBox.Show(ex.Message)
        End Try
      End While
    End Using
  End Sub
'VBのコード ここまで------------------------------------

<読み込む固定長ファイル>
01やまだいちろう26
02やまだじろう 23


<実行結果>
01
やまだいちろう
26
02
やまだじろう
23


>reader.SetFieldWidths(2, 7, 2)
この部分を
>reader.SetFieldBytes(2,14,2) '関数名は適当
このように指定できないか、と考えています。

TextFieldParserによる固定長テキストファイルの読込で、
桁数を文字数ではなく「byte数」で指定する方法を教えてください。
(FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です)
以下に、文字数指定による読込のコードを記述します。
よろしくお願いします。

'VBのコード-----------------------------------------------
  Public Shared Sub Main()
    Using reader As New TextFieldParser("C:\test.txt", Encoding.GetEncoding("SHIFT_JIS"))
      reader...続きを読む

Aベストアンサー

もしかすると的外れかもしれないですが……
要するに「02やまだ じろう 23」とか、半角が混じっているとおかしく
なるので全角は二バイト文字として処理したいということでしょうか?

> FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です

UTF-8 などの必ずしも全角文字が 2 バイトと限らない文字コードを扱う
時点で「全角は 2 バイト」というのは破綻してしまうと思います。

# たしかに Shift_JIS なので全角は 2 バイトですが……
# 文字は全角も半角も一文字と数えるという仕様なのだと思われます。

一旦、一行全て読み込み、文字列をバイト配列に変換して処理するのは
いかがでしょうか?

取り敢えず、こんな感じで貼られていたコードを部分的に変更してみま
した。

※ 見栄え上、全角文字列でインデントしてあります。
  拙いコードですのが、ご容赦下さい。

REM 動作確認した時に関数にしたのでそのままです。
Sub ReadFile()
 Using reader As New TextFieldParser("C:\test.txt", Encoding.GetEncoding("SHIFT_JIS"))
  REM reader.TextFieldType = FieldType.FixedWidth
  REM reader.SetFieldWidths(2, 7, 2)
  reader.TextFieldType = FieldType.Delimited

  Dim currentFields() As String
  While Not reader.EndOfData
   Try
    REM currentFields = reader.ReadFields() ' 一行読込
REM 読み込みと同時に関数へ渡す
    currentFields = GetFieldString(reader.ReadLine, "SHIFT_JIS", 2, 14, 2)
    Dim currentField As String
    For Each currentField In currentFields
     Trace.WriteLine(currentField)
    Next
   Catch ex As MalformedLineException
    MessageBox.Show(ex.Message)
   End Try
  End While
 End Using
End Sub

Function GetFieldString(ByRef Str As String, ByRef strEncode As String, ByVal ParamArray Prams() As Integer) As String()
 Dim iPram As Integer
 Dim iIndex As Integer = 0
 Dim iStrP As Integer = 0
 Dim strArray As String() = {""}
REM バイト配列に変換
 Dim ByteArray As Byte() = Encoding.GetEncoding(strEncode).GetBytes(Str)

 For Each iPram In Prams
REM 文字列に変換して文字列の配列に格納
  strArray(iStrP) = Encoding.GetEncoding(strEncode).GetString(ByteArray, iIndex, iPram)
  iStrP = iStrP + 1
  ReDim Preserve strArray(iStrP)
  iIndex = iIndex + iPram
 Next
REM 余分な配列を除く
 ReDim Preserve strArray(iStrP - 1)
 Return strArray
End Function

もしかすると的外れかもしれないですが……
要するに「02やまだ じろう 23」とか、半角が混じっているとおかしく
なるので全角は二バイト文字として処理したいということでしょうか?

> FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です

UTF-8 などの必ずしも全角文字が 2 バイトと限らない文字コードを扱う
時点で「全角は 2 バイト」というのは破綻してしまうと思います。

# たしかに Shift_JIS なので全角は 2 バイトですが……
# 文字は全角も半角も一文字と数えるという...続きを読む

Q「該当」と「当該」の違い

辞書には、「該当」・・・その条件にあてはまること。「当該」・・・その事に関係がある。
・・・とあります。
“あてはまる”と“関係がある”、微妙に違うようで似ているようで、お恥かしいのですが私にははっきり区別ができないのです。
該当とすべきところを当該としたら、意味はまったく違ってくるでしょうか?
わかりやすく両者の違いや使い方を解説していただけませんか?宜しくお願いします。

Aベストアンサー

よく似た意味の言葉(名詞)ですが、

○該当…「する」をつけて「当てはまる」という意味の動詞として用いることができる

○当該…主に他の名詞の前につけて「今議論の対象になっている、まさにそのもの」という意味で内容を限定する形容詞的な形で用いる

といった違いがあります。逆の用法はありません。

・この条件に当該する人は申し出てください。

・○○事件につき、該当被告人を有罪に処す。

いずれもおかしな使い方で、反対でないとアウトです。

ご参考になれば幸いです。

Qcsvファイル 項目数取得

おはようございます。
VB6.0使ってます。
よろしくお願いします。

csvファイルの項目数を数えたいのですが、新・旧レコードの2つが混ざっており、項目数も違います。項目にはデータだけでなく空もあります。

例:
001,suzuki,19800101,,tokyo,F
002,tanaka,19800202,A

新は項目が6あるが
旧は4つしかない。
時々、項目には空も混ざっている。
For文で数えてみようとしたのですが、旧だと項目数が足りないので数えられないですねf^^;
同様に6番目があるかないかとかアホウなことも考えましたがこれも無理でした。

アドバイス、ヒント、ツッコミ、よろしければお願いいたします。

Aベストアンサー

Splitを使うと、カンマ区切り(その他でもできますが)のデータを
分解することができます。
分解したデータを格納した配列の要素数を取得すれば、項目数がわかるのでは?
参考までに、以下にサンプルとしてコードを記します。
(エラー処理などは特につけてません。)
ミスがあったらごめんなさい('';)

Public Sub ReadFile()
Dim strFilename As String
Dim intFileNo As Integer
Dim blnOpenFlg As Boolean
Dim vntBuf As Variant
Dim strBuf As String
Dim lngCnt As Long
Dim lngDataCnt As Long

'初期値設定
blnOpenFlg = False

'ファイル名設定
strFilename = "C:\TEST.csv"
intFileNo = FreeFile()

'ファイルオープン
Open strFilename For Input As #intFileNo
'ファイルオープンしたらフラグOn
blnOpenFlg = True

lngCnt = 1
Do While Not EOF(intFileNo)
'データを一行単位で読込
Line Input #intFileNo, strBuf
'Splitをつかって、取り出した文字列を分解
vntBuf = Split(strBuf, ",")
'要素数を取得
lngDataCnt=uBound(vntBuf)+1

MsgBox Cstr(lngcnt) & "行目の項目数は" & Cstr(lngDataCnt) & "個です。"

lngCnt = lngCnt + 1
Loop


'ファイルを閉じる
If blnOpenFlg = True Then
Close #intFileNo
blnOpenFlg = False
End If

End Sub

Splitを使うと、カンマ区切り(その他でもできますが)のデータを
分解することができます。
分解したデータを格納した配列の要素数を取得すれば、項目数がわかるのでは?
参考までに、以下にサンプルとしてコードを記します。
(エラー処理などは特につけてません。)
ミスがあったらごめんなさい('';)

Public Sub ReadFile()
Dim strFilename As String
Dim intFileNo As Integer
Dim blnOpenFlg As Boolean
Dim vntBuf As Variant
Dim strBuf As String
Di...続きを読む

QVB6 配列を初期化したい

VB6でループさせて配列に値を入れて、計算させて最終的に求めたい値をRとします。そのときループで繰り返すためか同じ配列に値を入れてどんどん値がでかくなりRの値がおかしくなってしまいます;
おそらく問題は一回前に入れた配列がそのままのこってしまってるからなのだと思うのですが;
配列の中の値をクリアする方法はないものでしょうか?
一応、配列=0として初期化しようとしても値は変わらず前のが残ったままになってしまっています;
どなたかわかる方いらっしゃいましたらご回答宜しくお願いします

その他何かいい方法があればそれも教えていただけたらと思います

Aベストアンサー

Eraceステートメントを使用

  Dim a() as Long
  Dim s(100) as String
  Dim x() as Long

  Erase a     ’要素が0になる
  Erase s     ’要素が""になる

  Redim x(100) as Long

  Erase x      ’メモリを解放

注)VB2005の場合は動作が異なるので注意して下さい。

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QVBAで指定したシートの指定したセルに

VBAで指定したシートの指定したセルに
何かを書き込む場合どうすればいいのでしょうか?


Sheet1に配置されてあるボタンをクリックしたとき
Sheet3のC1に"AAA"を書き込みたい。

Aベストアンサー

こんばんは

Sub Sample()
Worksheets(3).Range("C1").Value = "AAA"
End Sub

で出来ます。

起動ボタンは「オートシェイプ」や「フォームのボタン」で「右クリック-マクロの登録」で作ることが出来ます。



ご質問の内容は非常に基礎的です。まずは書籍やウェブサイトなどで基礎をきっちりと学ぶことをお勧めします。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報