- ベストアンサー
Excelへの大量の01文字列データの取込み
テキストデータで0と1で表現した1行 数百万文字のデータがあります。 これをEXCEL2016のシートにコピー&ペーストで取り込むと、1セルあたり32765文字のデータで溢れてしまいます。 これを自分で指定した任意の文字数ずつ以下のように格納するにはどうしたら良いでしょうか? (以下は100文字指定の格納例) A1=100文字 A2=100文字 : : A100=100文字 : : エクセルVBAで処理できるとありがたいです。 以上、よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
今調べたら、VBA で扱える文字列は約20億文字でした。 (私はてっきり昔のBASIC の様に 65536文字と思い込んでいてあのような袱紗綱プログラムになりました) 変更点 ・ファイルは1回ですべて読むようにした ・プログラム頭で文字数の変更を可能にした ・テキストファイルに変更しました。 Option Explicit ' Sub Macro1() Const Length = 100 Dim File As String Dim Index As Long ' [A:A].ClearContents [A:A].NumberFormatLocal = "@" File = Application.GetOpenFilename("テキストファイル,*.txt") ' If File = "False" Then End End If Open File For Input As #1 Application.ScreenUpdating = False Line Input #1, File ' For Index = 1 To Len(File) Step Length Cells(Index / Length + 1, "A") = Mid(File, Index, Length) Next Index Close End Sub 前回答を消したい。
その他の回答 (4)
- NuboChan
- ベストアンサー率47% (785/1650)
すいません。 指定行数ではなく指定文字数でしたね。 No.3さんとほぼ同じですがUpしますね。 Input関数では、1行の文字数に制限はないようなので 巨大ファイルでも行けそうですが簡単な検証しか行っていないので 上手くいかない場合は破棄してください。 テキストファイルのパスと名前、 分割する文字数は、コード内で変更できます。 また、出力するセルの位置も、RowとColの変数で調整できます。 Option Explicit Sub test() Dim FileName As String 'テキストファイルの名前 Dim FileNum As Integer 'テキストファイルの番号 Dim TextLine As String 'テキストファイルの1行分の文字列 Dim CharNum As Integer '分割する文字数 Dim Row As Integer '出力する行番号 Dim Col As Integer '出力する列番号 Dim i As Long FileName = "C:\Users\TAC_\Desktop\test.txt" 'ターゲットテキスト FileNum = FreeFile 'テキストファイルの番号 CharNum = 5 '分割する文字数 Row = 1 '出力する行番号 Col = 1 '出力する列番号 Open FileName For Input As FileNum 'テキストファイルの読み込み Columns(1).NumberFormatLocal = "@" '文字列に Do Until EOF(FileNum) ' Line Input #FileNum, TextLine 'テキストファイルから1行分の文字列を読み込む For i = 1 To Len(TextLine) Step CharNum '文字列の長さ分だけCharNumごとに繰り返す Cells(Row, Col) = Mid(TextLine, i, CharNum) '文字列を指定文字数で分割してセルに書き出す Row = Row + 1 '出力する行番号を1増やす Next i Loop Close FileNum 'テキストファイルを閉じる End Sub
お礼
再度回答いただきありがとうございました。皆さんの回答を参考に頑張ってみます。
- SI299792
- ベストアンサー率47% (772/1616)
ファイルの指定方法がわからないので、ダイアログボックスにしました。 Option Explicit ' Sub Macro1() Dim File As String Dim ROut As Long ' [A:A].NumberFormatLocal = "@" File = Application.GetOpenFilename("CSVファイル,*.csv") ' If File = "False" Then End End If Open File For Input As #1 Application.ScreenUpdating = False ' Do While Not EOF(1) ROut = ROut + 1 On Error GoTo 100 File = Input(100, #1) On Error GoTo 0 Cells(ROut, "A") = WorksheetFunction.Clean(File) Loop Close 100 ' If Err <> 62 Then Error Err End If Close End Sub 調べたけれど、文字数指定で読める命令は INPUT関数しかありませんでした。 やって見たけれど、この命令文字数が 100で割り切れないとエラーになります。 ON ERRORを使った、汚いプログラムですが。
補足
回答ありがとうございます。 情報足りずすいません。入力ファイルは.txtデータを読み込められれば指定方法に希望はありません。 このコードはvbaに入力し、文字数指定はコード内で行うということで合ってますか?
- NuboChan
- ベストアンサー率47% (785/1650)
そもそも1行が数百万文字のテキストファイルなのでEmEditorを利用しているのでしょうね。 以下参照ください。 1)PowerShellで指定文字数に分割したテキストファイルを作成後 https://tsuredurediary.com/archives/windows-textfile-split.html https://aprico-media.com/posts/9497 2)EXCELのセルに分割したファイルを読み込ませれば出来ると思います。 https://kirinote.com/excelvba-txtfile-paste/. https://www.higashisalary.com/entry/read-some-text.
補足
回答ありがとうございます。1)のリンクを確認すると指定文字数ではなく指定行数データの分割になっているのですが、今回の1行のデータの分割にも活用可能なのでしょうか?
- Bn4Cm9a
- ベストアンサー率18% (19/103)
ずばりの回答ではない。 > VBAでバイナリファイルを読み込む(一括、1バイト、指定バイト) https://vbabeginner.net/read-binary-file/ を参考に100バイトずつファイルを読むと、その中身は0か1のアスキーコードになる。違うとしても2種類だ。配列の中身を0か1に置き換え、セルに書き込む。 をできそだと私は思った。
お礼
回答ありがとうございました。いまいちバイナリファイルの読み込みやデータの置き換えが分からず。。もう少し考えてみます。
お礼
改良版upいただきありがとうございました。おかげでデータ整理できました。