Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3908 / 13644 ツリー ←次へ | 前へ→

【59448】Getで読んだバイト配列文字列をバイト指定で区切る りった 08/12/11(木) 16:25 質問[未読]
【59449】Re:Getで読んだバイト配列文字列をバイト指... neptune 08/12/11(木) 16:53 発言[未読]
【59450】Re:Getで読んだバイト配列文字列をバイト指... kanabun 08/12/11(木) 16:57 発言[未読]
【59453】Re:Getで読んだバイト配列文字列をバイト指... kanabun 08/12/11(木) 17:34 発言[未読]
【59459】Re:Getで読んだバイト配列文字列をバイト指... neptune 08/12/11(木) 22:02 発言[未読]
【59538】Re:Getで読んだバイト配列文字列をバイト指... りった 08/12/17(水) 15:21 発言[未読]
【59545】Re:Getで読んだバイト配列文字列をバイト指... りった 08/12/17(水) 20:14 お礼[未読]
【59475】Re:Getで読んだバイト配列文字列をバイト指... Yuki 08/12/12(金) 16:22 発言[未読]

【59448】Getで読んだバイト配列文字列をバイト指...
質問  りった  - 08/12/11(木) 16:25 -

引用なし
パスワード
   下記のように、CSVファイルをバイトの配列として読んだ後、
指定バイトから指定バイトまでの文字列を取りたいのですが、
どうしたらよいでしょうか?

Dim bytBuf() As Byte
Dim fNum As Long
Dim fLen As Long

fLen = FileLen(sPath)
ReDim bytBuf(1 to fLen)
fNum = FreeFile()
Open sPath For Binary As #fNum
Get #fNum, , bytBuf

別のバイト配列を作って、一個ずつ詰め替えした後、
StrConv(・・・, vbUnicode)すれば出来るでしょうが、
パフォーマンスが心配です。

尚、本件下記で質問させていただいた件と、目的は同じです。
【59391】でっかいCSVをExcelでサクッと開きたい

【59449】Re:Getで読んだバイト配列文字列をバイト...
発言  neptune  - 08/12/11(木) 16:53 -

引用なし
パスワード
   ▼りった さん:
▼りった さん:
>尚、本件下記で質問させていただいた件と、目的は同じです。
>【59391】でっかいCSVをExcelでサクッと開きたい
なら先ず、【59391】の後始末すべきでしょう。
役にもたたんですが、一応書き込みましたんで。

+前のスレでファイルの仕様が曖昧だったのではっきりさせるべきでは?

【59450】Re:Getで読んだバイト配列文字列をバイト...
発言  kanabun  - 08/12/11(木) 16:57 -

引用なし
パスワード
   ▼りった さん:

>下記のように、CSVファイルをバイトの配列として読んだ後、
>指定バイトから指定バイトまでの文字列を取りたいのですが、

こういうことならできます。

 Dim bytBuf() As Byte
 Dim Buf2() As Byte
 Dim j1 As Long, j2 As Long
 
 '(1)ファイルから バイト配列 bytBuf()取得
 
 '(2)特定区間を別の配列に切り出す
   j1 = 2
   j2 = 10
   Buf2 = MidB(bytBuf, j1, j2 - j1 + 1) '指定バイト区間をバイト配列に代入
   MsgBox StrConv(Buf2, vbUnicode)

【59453】Re:Getで読んだバイト配列文字列をバイト...
発言  kanabun  - 08/12/11(木) 17:34 -

引用なし
パスワード
   ついでに、、、

バイト配列の中からCRLFなどの特殊コードを見つけるには、
InStr でなく InStrB関数を使います。

 Dim CRLF() As Byte: CRLF = StrConv(vbCrLf, vbFromUnicode)
 Dim Buf2() As Byte
 
 '(1) ファイルから バイト配列を読み込む

 '(2) 2行目をとりだす (改行コード は CRLFとする)
 j1 = InStrB(bytBuf(), CRLF)
 If j1 Then
   j2 = InStrB(j1 + 2, bytBuf(), CRLF)
   If j2 Then
     Buf2 = MidB(bytBuf, j1 + 2, j2 - j1 - 2)
     MsgBox StrConv(Buf2, vbUnicode)
   End If
 End If

【59459】Re:Getで読んだバイト配列文字列をバイト...
発言  neptune  - 08/12/11(木) 22:02 -

引用なし
パスワード
   ▼りった さん:
こんにちは

行末の改行コードがLFという事なのでまだ、疑問があります。
勘だけですが、そもそも、文字コードはANSIやshift-Jisじゃなく
EUC-JPの感じもするんですが。

そうなると、先ず文字コードの変換からと思いますので。
確か、ExcelやAccessはEUCをサポートしているので通常操作ではわからないかも???(未確認自信なしですが)

これまで判明していること
/////////転記/////////////
尚、CSVの書式は下記のようです。
・カンマでデータを区切っている。
・ダブルクォーテーション内に改行が有りうる。改行コードは複数種類有り得る様子。(CR,LF,CRLF)
・ダブルクォーテーションの中は任意の文字が入る。
・ダブルクォーテーション内のダブルクォーテーションはダブルクォーテーション2つ
・ダブルクォーテーション内のカンマは唯のカンマ
・日付のデータがある。(現状↓のコードを実行すると一部変な結果になる。dd/mm/yy等と認識されてるっぽい)
・行末コードはLF
・行内にcrlfがあることがある。
・ファイルサイズは50MB前後
・行毎に、列数が変わる恐れがある。

【59475】Re:Getで読んだバイト配列文字列をバイト...
発言  Yuki  - 08/12/12(金) 16:22 -

引用なし
パスワード
   ▼りった さん:
>下記のように、CSVファイルをバイトの配列として読んだ後、
>指定バイトから指定バイトまでの文字列を取りたいのですが、
>どうしたらよいでしょうか?

そのCSVファイルのデータを数行張付けてみられては?
そんなに特殊であればデータを見なければ誰も判断が出来ないと
思いますが。

【59538】Re:Getで読んだバイト配列文字列をバイト...
発言  りった  - 08/12/17(水) 15:21 -

引用なし
パスワード
   >行末の改行コードがLFという事なのでまだ、疑問があります。
>勘だけですが、そもそも、文字コードはANSIやshift-Jisじゃなく
>EUC-JPの感じもするんですが。

メモ帳で漢字部分も普通に読めるのでEUCでは無いと思います。
(「メモ帳で漢字読める→EUCではない」に自信有りません。認識違いでしたら後指摘下さい。)

尚、CSVの書式は下記のようです。
・カンマでデータを区切っている。
・ダブルクォーテーション内に改行が有りうる。改行コードは複数種類有り得る様子。(CR,LF,CRLF)
・行末コードも複数種類有り得る様子。(CR,LF,CRLF)
・ダブルクォーテーションの中は任意の文字が入る。
・ダブルクォーテーション内のダブルクォーテーションはダブルクォーテーション2つ
・ダブルクォーテーション内のカンマは唯のカンマ
・日付のデータがある。(yyyy/mm/ddの文字列がある。他の形式が有るかは未明)
・ファイルサイズは50MB前後
・行毎の列数は固定
・列の追加/削除の可能性が有るので、その際のマクロ変更量を少なくしたい。

とりあえず状況報告まで。
しばらく格闘しているので別途質問させて頂くまで回答不要です。

【59545】Re:Getで読んだバイト配列文字列をバイト...
お礼  りった  - 08/12/17(水) 20:14 -

引用なし
パスワード
   どうやっても速くならなさそうなので諦めました。
お手数をおかけしました。

3908 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free