• 締切済み

ExcelVBA CSV分割取込 巨大ファイル+LF

お世話になります。 ちょっと一服中のVBA経験豊富な方、どうかお助け下さい。 下記条件のマクロ作成についてご助言いただけると大変うれしいです。 よろしくお願いいたします。 -------------------------------------------------- 【PC環境】 開発環境:日本、XP.ver2002、SP3、Excel2003 実行環境:海外、XP.ver5.1、SP3、Excel2002 (備考:実行環境と類似のPCを準備中・・) 【やりたいこと】 1)巨大なCSVデータをExcelへシート分割して取り込みたい。  (巨大…行:最大45万行以下、列:8列固定、35M以下) 2)Access/ADOは使用しない  (海外環境で利用目的のため、(参照設定等の)エラー発生による対応が難しいため) 3)CSVは、「"」つき、改行コードが「LF」です(TT)  (CSVはユーザさんが特定システムよりダウンロードする。   CSV本体のコード変更はユーザさんの拒否反応が予想されるためできません・・) -------------------------------------------------- 質問の過去ログやいろんなサイトで調べていましたがそろそろ時間制限がせまってきました。 ネックは「巨大なCSV」+「改行コードLF」です。 もちろんこちらで質問しつつ自分でも試行錯誤してみますが、 何か良い知恵、また参考ページ、コードなど、情報をお持ちの方、是非紹介いただけませんでしょうか。 (ついでに英語環境で動かすマクロ初体験なので注意点とかありましたらあわせてご紹介頂けるとすごくうれしいです) 類似ページがあった場合には本当に申し訳ありません、力不足で探しきれていません>< お手数ですがしょうがねぇやつ~とURLなど張っていただけると大変助かります。 また近頃の不景気影響で残業規制されており、お礼は16日以降となる可能性が高いです。お許しくださいませ・・ ダメダメな感じですが、どうぞよろしくお願いいたします!

みんなの回答

  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.2

VBAは趣味程度のCプログラマですが、分割君は持って置いて損はなさそうなのでやっつけで作ってみました。 もはやExcelである必要のないコードになってしまいましたが。。 ファイルを分割します。分割するにあたってLFに当たればCRを付けます。 LFの前がCRだったらとか、同名のファイル名があることは考慮していません。 分割した後はマクロで読み込んでExcelに展開するなどご自由に。 英語環境では日本語の変数を使うとコンパイルエラーになります。 あと日本語のメッセージ(Msgbox "日本語"とか)は?????みたいなのが出ると思います。 日本語のコメントも文字化けします。 Option Base 0 Option Explicit '分割行数 Private Const DivRowCnt As Long = 65000 Sub CallDiv() 'ファイル名を与える Call DivFile("G:\mudai.txt") End Sub 'ファイル分割、改行コード変換 Sub DivFile(Filename As String) Dim rbuf() As Byte Dim wbuf() As Byte Dim RFNo As Integer Dim WFNo As Integer Dim Size As Long Dim i As Long Dim wPos As Long Dim WFCnt As Integer Dim LFCnt As Long RFNo = FreeFile() Size = FileLen(Filename) ReDim rbuf(0 To Size - 1) Open Filename For Binary Access Read As #RFNo Get #RFNo, , rbuf Close #RFNo WFCnt = 1 LFCnt = 0 wPos = 0 WFNo = &H7FFF For i = 0 To Size - 1 If WFNo = &H7FFF Then WFNo = FreeFile() 'Filename.csvをFilename_div1.csvのように名前を付けてファイルを作成する Open Replace(Filename, ".csv", "") & "_div" & WFCnt & ".csv" For Binary Access Write As #WFNo WFCnt = WFCnt + 1 '改行コードの分だけ追加で確保する ReDim wbuf(0 To Size - 1 + DivRowCnt) End If 'LFだったらCRを付けて改行数をインクリメント If rbuf(i) = 10 Then wbuf(wPos) = 13 wPos = wPos + 1 LFCnt = LFCnt + 1 End If '"を書き込みたくなければ条件を付ける rbuf(i) = &H22だったら書き込まないとか wbuf(wPos) = rbuf(i) wPos = wPos + 1 '改行数が指定数に達したら書き込む If LFCnt = DivRowCnt Then ReDim Preserve wbuf(0 To wPos - 1) Put #WFNo, , wbuf Close #WFNo '初期化 WFNo = &H7FFF LFCnt = 0 wPos = 0 Erase wbuf End If Next i '後始末 If WFNo <> &H7FFF Then ReDim Preserve wbuf(0 To wPos - 1) Put #WFNo, , wbuf Close #WFNo End If Erase wbuf Erase rbuf End Sub

ubaltu
質問者

補足

回答ありがとうございます!! (後日改めてお礼したいので補足欄にて失礼します) >コード poooon(  Д ) ゜ ゜ こっこの発想はありませんでした・・!!! このコードは、Accessが超苦手だけどデータ分析しなければならない沢山のお父さんたちを救うことができる奇跡のコードです・・! 今後私の所属部署の沢山のお父さんが救われることでしょう。 心より感謝いたします。 またこの質問のためにお時間割いていただきありがとうございました。 後ほど問題が解決しましたら改めてお礼に参ります。 それにしてもやはり巨大ファイルのExcel取り込みは無茶な課題なのかもしれませんね・・ Excelにとっては想定外のオーバーワークでしょうから・・ Excel、ごめんね・・

  • OKwebb
  • ベストアンサー率44% (92/208)
回答No.1

> VBA経験豊富な方 じゃないんで、アドバイスのみ。 FileSystemObject使ってOpenAsTextStreamメソッドで開いてReadで固定バイト数(ex.100K)で読み込み、カンマで区切って、vbLFで次行へ、行数65536で次シートへってのはどうかなぁ。 実行環境のスペック次第って感じになっちまいますが。 CSVの文字コードも気になりますが・・・。

ubaltu
質問者

補足

回答ありがとうございます!! 補足します。 4)CSVの文字コードは、SJISです。 5)スペックですが、メモリについては開発・実行環境ともに2GなのでOKかと!  他のスペックはすぐには判りません・・すみません; >固定バイト数(ex.100K)で読み込み おおおなるほどお!コレなら何とか力技でできそうですね!!試してみます! 本当にありがとうございました~ また気付き点ありましたらご指摘お願いいたします!

関連するQ&A

  • CSVファイルの取り込みについて

    CSV取り込み方法について 教えていただきたくお願いいたします。 エクセルのマクロ・VBAの組み方について デスクトップ上の000という名前のCSVファイルを、作業しているエクセルファイルのLoadという名前のシートに貼り付けたいと思っています。 CSVファイルはエクセルで開くと1行に11列の項目が展開されています。 貼り付ける項目はこのようになります。 (CSV) →(エクセルのLoadシート) 1列目(A行)→B行へ 2列目   →C行へ 3列目   →D行へ 4列目   →E行へ 5列目   →F行へ 9列目   →G行へ 10列目  →H行へ 11列目  →I行へ (6.7.8列目は使いません) 最後にLoadのシートのA行に”=B&E”とい式を入力したいと思っています。 まだ初心者なので勉強中なのですが、仕事上急遽必要になりましたのでお願いいたします。

  • CSVファイルの改行コード判別

    CSVファイルをLine Inputメソッドで1行毎に読み込みたいのですが、 セル内の改行により、1行分として読み込む事ができません。 セル内の改行コードは「vbLf」が使用されているとの認識でいますが、 仮に「vbLf」が改行コードとして使用されていれば、メモ帳などで 開くと「vbLf」の部分は改行されないと思っています。 ところが、問題のCSVをメモ帳で開くとセル内改行部分も改行されて 表示されます。 Line Inputメソッドの1行分は、改行コード「vbCrLf」までで、 改行される位置がメモ帳で開いた結果と同じになります。 そうなると、セル内の改行に使用されている改行コードに何が 使用されているのでしょうか? 環境は、Windows7、EXCEL2013です。

  • 【VB6】項目内に改行コードを含むCSVファイルの読み込み

    いつもお世話になっております。 現在VB6.0にて、CSVファイルを読み込む処理をしています。 ・ファイル読み込みにて1行ファイルを読み込む。 ・Split関数で「,」で区切って項目ごとに配列に保持する。 というロジックで作成しているのですが、 項目内に改行コードが存在する場合にうまく読み込めません。 (1行ずつ読んでるので当然ですが…) 項目内のコードをLF、実際の行の改行をCR+LFで区別すると読み込む のは分かるのですが、項目内の改行コードがCR+LFの場合でも、 正しく読み込みたいです。 以上です。よろしくお願い致します。

  • CSVファイルの改行コードを確認したい

    お世話になります。 AccessにてCSVファイルの特定の行を読み込みたいと考えております。 http://questionbox.jp.msn.com/qa8769403.html とりあえず読み込むことは出来たのですが、実データで試したところエラーとなってしまいました。 調べたところ、改行コードにはいくつか種類があり、恐らくLFコードであるために読み込みできないものかと思われます。 なお、実データをExcelで開き上書き保存すると読み込みできるようになるので、上書き保存したタイミングでLFがCR/LFに変わったのではないかと思われます。 で、質問としては実データの改行コードが本当にLFなのかどうかを確認したいのですが、どうやって確認すればよいのでしょうか。 ご教授の程、宜しくお願い致します。

  • CSVの仕様について

    改行コードとカンマの取り扱い。 最近の一般的なWINDOWSアプリケーションでCSVの取り扱いは (1) 行区切りの改行コードはCRLFで行います。 データ内の改行コードは、LFで行う。 (2) カンマ付きのデータは『"』クォーテーションで囲む その際、元のデータ内の『"』は『""』でエスケープ。 (1)(2)の仕様でよいのでしょうか? 自身でCSV生成とパースを書きたいのですが、RFCは参考にしますが、 実際のポュラーな仕様に合わせたいので調べています。 ご意見でも構いません宜しくお願いします。

  • ExcelVBAでフォルダ内の全csvを開き一行に

    ExcelVBAで、指定フォルダ内の全csvファイルのデータを開き 行列変換して一行毎に並べていきたいのです。 csvファイル数は、処理する時により、増減あります 似たような質問もあるようですが、いくつか見比べるとコマンドが異なってると、混乱してしまい、通しで回答いただけると、理解もできるかと質問させていただきます。 よろしくお願いいたします。 ■操作&データ並べるファイル Sheet:menu こちらに、指定フォルダなど入力、マクロ実行ボタン配置 Sheet:data こちらに、1行づつ、csvファイルのデータを貼り付け ■csvデータ:1001.csv、1002.csv、・・・、1010.csv ■各csvデータ の並び A列 B列  C列 日付 04/01 時間 10:32 番号 1001 A1  OK  0.12 A2  OK  4.92 A3  NG  7.89 B1  0.05 B2  0.95 C1  101.2 C2  95.4 ・  ・ ーーーSheet:data の貼り付け後の並びーーーーーーーーーーーーーー 1001 04/01 10:32 0.12 4.92 7.89 0.05 0.95 101.2 95.4 ・ 1002 04/01 10:45 ・  ・  ・  ・  ・  ・  ・ ・  1003  ・  ・  ・  ・  ・  ・  ・  ・  ・ ・ ・ ・ 1010  ・  ・  ・  ・  ・  ・  ・  ・  ・ ・ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー csvのデータは、3列で100行ほどありますが、 必要なデータの場所は、列が変わったりします

  • CSVファイル読込みについて

    CSVファイル読込みで困っています。 どなたかご教授をお願い致します。 CSVファイル読込みを行うと、複数行のデータにも関わらず、ネットで調べたプログラムを用いると、1行で読込まれてしまいました。 その原因として、NL(LF)で改行されていたためです。 これをどうにか複数行で読込みを行うための方法はありませんか? NLがある場合、それをvbCrLfに変換してやればよいとは思ったのですが、うまくプログラムを組むことができません。 プログラムをどう組めばよいのか教えて頂けないでしょうか? 以下のサイトを利用させて頂き、読込みを行おうとしました。 http://www.k1simplify.com/vba/tipsleaf/leaf291.html VB初心者なので、どなたかご教授頂けると助かります。 よろしくお願い致します。

  • csvダウンロードで改行コードを指定する事は可能?

    画面から「csvダウンロード」というボタンを押すと、 javaが動いてcsvファイルのダウンロードができるのですが 改行コードがLFになってしまいます。 改行コードCR+LFにしたいのですが・・・。 恐らくサーバがUNIXだからだと思うのですが javaでcsvファイル作製時に改行コードを 変更もしくは指定する事は可能でしょうか? どなたかご教授ください。 よろしくお願いします。

  • ファイル出力の改行コードをLFに

    また質問です。よろしくお願いいたします。 WindowsXPでperl5.8.7の環境です。 出力したファイルの文字コードをEUC、改行コードをLFで出力をしようとしています。 なお入力、出力ファイルには日本語が含まれています。 文字コードは希望通りいくのですが改行コードがうまくいきません。 Windowsのデフォルト改行コードCR+LFが出力されてしまいます。 (Terapad(エディタ)の改行コード表示がこうなっています。) (1)binmode(OUT);で行うと、 Wide character in print at jisyo01.pl line 63, <IN> line 97. というエラーが表示され、出力されない。 (2)$xxx[$i] =~ s/\x0D\x0A/\x0A/g; で改行コードを置換しようとしても、置換されず、 CR+LFである。 (3)$/ = pack("C", hex("A"));で 改行コードをchompした後、print OUT "$/";としても、 CR+LFのままである。 上手くいきません。いい方法ないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • フォルダ内の複数ファイルから抽出(vbs)

    web のログファイルの集計のため、以下が可能なコードを教えていただきたい。 そのまま使えるコードですと非常に助かります。 (vbs または vba) logというフォルダに、複数のログファイルが入っています。 ファイルの文字コードは、UTF8  改行は、LFです。 この複数のファイルから、特定の文字列の入っている行を抜き出して、 1つのCSVファイルに書き出したい。(文字コードをShift-Jis 改行は、CRLFに変えたい) どうかお助けください。宜しくお願いいたします。