• ベストアンサー

アクセスにtxtファイルの指定行のみインポートしたい

先ほども、似たような質問をさせて頂いたのですが、おおもととして、質問していた、textファイルのインポート自体は出来るようになりましたので、 質問を絞って再度、ご質問させて下さい。 textファイルをインポートすると、”データ型の変換エラーが発生しました。”と出ます。 それは、textファイルに、他の行とは違う桁数の、余分な行(先頭行と最終行)があるからです。 先に、textファイルを開き、削除して行えば、問題ありませんが 出来れば、何も編集せずにアクセスで、何行目から何行目までを取り込む。と言った物にしたいです。 csvなどは、簡単に設定できるようですが、textも出来るのでしょうか? ちなみに、今の構文を書いておきます。 どちらに、その構文を追加すれば、いいのかまで、教えていただけると大変助かります。 Private Sub コマンド64_Click() Dim strLine As String Dim dbs As Database Dim rst As Recordset Set dbs = CurrentDb Set rst = dbs.OpenRecordset("支払明細") Open CurrentProject.Path & "\支払明細.txt" For Input As #1 Do Until EOF(1) Line Input #1, strLine strLine = StrConv(strLine, vbFromUnicode) With rst .AddNew !旧請求年月日 = StrConv(MidB$(strLine, 14, 6), vbUnicode) !指定伝票番号 = StrConv(MidB$(strLine, 20, 7), vbUnicode) !種類 = StrConv(MidB$(strLine, 64, 8), vbUnicode) !数量 = StrConv(MidB$(strLine, 84, 5), vbUnicode) !単価 = StrConv(MidB$(strLine, 89, 7), vbUnicode) !請求金額 = StrConv(MidB$(strLine, 96, 11), vbUnicode) .Update End With Loop Close #1 rst.Close MsgBox "インポートを終了しました。" End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.4

>早速、chie65536さんの書いてくださった構文を追加して実行してみました。 >しかし、何故か、取り込めませんでした。 If MidB$(strLine, 1, 1) = "D" Then を If MidB$(strLine, 1, 1) = StrConv("D",vbFromUnicode) Then か If StrConv(MidB$(strLine, 1, 1),vbUnicode) = StrConv("D",vbUnicode) Then に修正して下さい。 比較式の左辺の文字列が「vbFromUnicode」になっているので右辺も「vbFromUnicode」にする、または、両辺を「vbUnicode」にする、と言う処理を忘れていました。 StrConvした文字列は、「"」で囲った文字列と、文字コード体系が異なるのでした。

d-loop
質問者

お礼

すごいっ!!出来ました!(^^)! 感謝しております。本当にありがとうございました。

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

その他の回答 (3)

noname#140971
noname#140971
回答No.3

次の FileReadNRow関数で指定行を読み込むことが出来ます。 1,AAAA 2,BBBB 3,CCCC ? FileReadNRow("C:\TEMP\Test.txt", 2) 2,BBBBB Public Function FileReadNRow(ByVal FileName As String, ByVal N As Integer) As String On Error GoTo Err_FileReadNRow   Dim I  As Integer   Dim fso As FileSystemObject   Dim fil As File   Dim txs As TextStream   Dim TEXT As String      Set fso = New FileSystemObject   Set fil = fso.GetFile(FileName)   Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)   For I = 1 To N     TEXT = txs.ReadLine   Next I   FileReadNRow = TEXT Exit_FileReadNRow:   Exit Function Err_FileReadNRow:   Resume Exit_FileReadNRow End Function Microsoft Scripting Runtime を参照する必要があります。 これを、工夫するか、 For I = S To N   strData=FikeReadNRow(I)   ・・・・ NEXT I という風に利用するか・・・。

d-loop
質問者

補足

アドバイスありがとうございます。 しかし、ド素人の私では理解不可能です。 取り込みたい行を1行だけ指定するのではなく、何行から何行と言った風にもできるのでしょうか??

すると、全ての回答が全文表示されます。
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

こういうテキストファイルは、たいてい 1桁目が1で始まるスタート行 1桁目が2で始まる明細行の1行目(1ブロック目)  | 1桁目が2で始まる明細行の最終行(1ブロック目) 1桁目が8で始まる合計行(1ブロック目) 1桁目が2で始まる明細行の1行目(2ブロック目)  | 1桁目が2で始まる明細行の最終行(2ブロック目) 1桁目が8で始まる合計行(2ブロック目) 1桁目が9で始まるエンド行 のようになっている筈です。テキストファイルの構造を良く確かめて下さい。 で、1行の中のどこかの桁に「この行は取り込むべき明細行である」と言う目印があった時だけ、データを取り込むように作りましょう。 「明細行は先頭1文字が『2』の時のみ」と仮定した場合、以下のようにif文を追加します。 Do Until EOF(1) Line Input #1, strLine strLine = StrConv(strLine, vbFromUnicode) if MidB$(strLine, 1, 1) = "2" then '先頭1文字が「2」の時のみ明細行 With rst .AddNew !旧請求年月日 = StrConv(MidB$(strLine, 14, 6), vbUnicode) !指定伝票番号 = StrConv(MidB$(strLine, 20, 7), vbUnicode) !種類 = StrConv(MidB$(strLine, 64, 8), vbUnicode) !数量 = StrConv(MidB$(strLine, 84, 5), vbUnicode) !単価 = StrConv(MidB$(strLine, 89, 7), vbUnicode) !請求金額 = StrConv(MidB$(strLine, 96, 11), vbUnicode) .Update End With end if '追加したif文の終り Loop なお「ちゃんと処理する」と言う視点から見ると「テキストファイルに合計行があるなら、読み込んだ明細行の合計と、合計行に書かれた合計が正しいかチェックする」とか「テキストファイルの特定の行の特定の桁に固定の数字や文字が入っているなら、その位置にその固定の数字や文字があるかチェックする」と言う処理も必要です。 こういうチェックをちゃんとしないと 「1万件のデータを読み込ませた後で、全然違う構造の全然違うテキストファイルを間違って読み込ませた事に気が付いた。元のデータは間違って読んだテキストファイルのデータで上書きされて元に戻せない。1万件のデータを伝票から全件手入力するハメに」 「途中で切れたファイルを読みこませたらしく、合計金額が合わないのに誰も気付かない。誰かが気付いた時には全データを全部の伝票と照らし合わせないとならない」 「修正したファイルを読み込ませたつもりが、間違って古いのを読み込ませ、合計金額が合わないのに誰も気付かない。誰かが気付いた時には全データを全部の伝票と照らし合わせないとならない」 なんて事が起きます。 「チェックもしないで、それがそこにある筈」と言う作り方をするのは「アマチュアが家庭で使う自作プログラム」だけにしましょう。

d-loop
質問者

補足

ありがとうございます。 このPGは、私が使用するだけで、元々目視で行っている、チェックにプラスアルファでやろうと思っているだけなので、 chie65536さんの心配して下さっているような事はありません。 これから、もっと勉強して、人にも使って貰えるような物が作れるようになればいいですが。。。 ちょっと私の脳ではついていけない感じです。なんて言っても、ド素人なので^_^; 早速、chie65536さんの書いてくださった構文を追加して実行してみました。 しかし、何故か、取り込めませんでした。 エラーは出ずに、インポート終了しました。と出ました。 インポート先のテーブルがおかしいのでしょうか? 取込たいデータの仕組みは、chie65536さんの言うとおり 見分けがつき、下記のような感じです。 B** *** D********** ******** D********** ******** T** ***** ***** Dで始まる行だけを取込みたいです。 テーブルの、項目は、 ID オートナンバー 旧請求年月日 数値型 指定伝票番号 数値型 種類 テキスト型 数量 数値型 単価 数値型 請求金額 数値型 です。 修正後の構文は Private Sub コマンド64_Click() Dim strLine As String Dim dbs As Database Dim rst As Recordset Set dbs = CurrentDb Set rst = dbs.OpenRecordset("支払明細") Open CurrentProject.Path & "\支払明細.txt" For Input As #1 Do Until EOF(1) Line Input #1, strLine strLine = StrConv(strLine, vbFromUnicode) If MidB$(strLine, 1, 1) = "D" Then With rst .AddNew !旧請求年月日 = StrConv(MidB$(strLine, 14, 6), vbUnicode) !指定伝票番号 = StrConv(MidB$(strLine, 20, 7), vbUnicode) !種類 = StrConv(MidB$(strLine, 64, 8), vbUnicode) !数量 = StrConv(MidB$(strLine, 84, 5), vbUnicode) !単価 = StrConv(MidB$(strLine, 89, 7), vbUnicode) !請求金額 = StrConv(MidB$(strLine, 96, 11), vbUnicode) .Update End With End If Loop Close #1 rst.Close MsgBox "インポートを終了しました。" End Sub です。 お手数ですが、再度、ご教授お願いいたします。

すると、全ての回答が全文表示されます。
  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.1

> strLine = StrConv(strLine, vbFromUnicode) と > !~ = StrConv(MidB$(strLine, ~, ~), vbUnicode) の部分で、気になってるのですが・・・ ・OSとAccessのバージョンは何ですか? ・「支払明細.txt」の文字コードは何で出力されてきてますか? Accessは、2000以降Unicodeが標準とされ、Windowsは、XP以降(2000も、そうだっけ?)、Unicodeが標準となってます 要するに、最初のvbFromUnicodeでシステム既定の文字(Unicode)に変換してあるのでは?と思ったりしているのですが・・・UnicodeをMIDBで、切れば文字としてしか扱えず、自動的に型の変換が出来なくて、 > ”データ型の変換エラーが発生しました。” が、起こってるのでは?と思ったりしたのですが・・・

d-loop
質問者

補足

アドバイスありがとうございます。 WINDOWS XP のACCESS2003です。 なんせ、素人ですので、文字コードが何で、出力されているのか、わからないのですが 1行目と最終行だけ、データの形式が違うと言うか、空白の数が違い それを、テキストで開いて、先に削除してしまってから、取り込めばうまくいきました。

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

関連するQ&A