
CSVファイルで100個のファイル数(各ファイル3列×50000行)を1つのexcelシートに結合させる方法を探しています。
結合させる際に各データを横に結合させ、最終的に各行の平均を算出させたいです。
データ数が多いため、これまでコピー→貼り付けを1つずつし、各行をexcel関数で平均算出をさせていたのですが、時間がかかってしまうのでプログラム等で出来ないかと思っています。
横に結合(貼り付け)作業だけでもVBAなどで出来るという話を聞いたのですが、イマイチわからないので教えて頂けたら幸いです。
A 回答 (4件)
- 最新から表示
- 回答順に表示

No.4
- 回答日時:
以前の質問ですと
https://oshiete.goo.ne.jp/qa/9443836.html
>ちなみに一つのファイルには3列、50000行のデータ量でこのファイルが100個以上ある現状です。
>質問者からの補足コメント
>うーん・・・
>各列ごとの平均を求めたいです。
>連結させる方法だと下にそのまま結合されてしまったので、イメージ的には横にそのまま貼り付けていけると助かります。
となっていて、各列の平均を求めたいとありますが、この件とは別件なのでしょうか?
今回の質問で、求めたいのは、各行の平均で間違いないですか?


No.3
- 回答日時:
VBAで作ってみました。
データを結合した後、最終列に平均値を求めるところまで処理します。
前提として、CSVファイルの拡張子は「csv」、区切り文字は「,」としています。
このプログラムでは実行速度を上げるために、1ファイルのデータ全てを配列に格納してからシートに書き出しています。もしかしたら環境によってはこの部分でメモリ不足が発生するかもしれません。
その場合は、ファイル単位ではなく行ごとに処理することで回避できますが、実行は大幅に遅くなると思います。性能が問題になる場合は、VBA以外の方法を検討した方がよいと思います。
準備:
(1)新規のExcelブックを開き、Alt+F11でVBEを起動する。
(2)VBEのメニューから[ツール]-[環境設定]を選択し、「Microsoft Scripting Runtime」のチェックを入れて[OK]ボタンを押す。
(3)標準モジュールに下記のコードを貼り付ける。
(4)Excelブックを保存する。
実行方法:
(1)準備の手順で保存したExcelブックを開く。
(2)CSVファイル100個をC:\temp\csvフォルダに配置する。
または、コード内のCSV_DIR_PATHの値を、実際にCSVファイルを格納しているフォルダの絶対パスに書き換える。
(3)Alt+F8で[マクロ]ダイアログを起動するなどの方法で、下記コードのマクロを実行する。
Sub CSVファイルの結合と平均算出()
Const COL_NUM As Long = 3 ' CSVデータの列数
Const ROW_NUM As Long = 50000 ' CSVデータの行数
Const CSV_DIR_PATH As String = "C:\temp\csv" ' CSVファイルの配置先フォルダ
Dim fso As FileSystemObject
Dim myFiles As Files
Dim myFile As File
Dim myStream As TextStream
Dim myLine As String
Dim data() As String
Dim fileCount As Long
Dim lineCount As Long
Dim buf(ROW_NUM - 1, COL_NUM - 1) As Double
Set fso = New FileSystemObject
Set myFiles = fso.GetFolder(CSV_DIR_PATH).Files
' 新しいブックを開く
Workbooks.Add
' CSVデータを読み込んでシートに貼り付ける
fileCount = 0
For Each myFile In myFiles
If myFile Like "*.csv" Then
fileCount = fileCount + 1
Cells(1, COL_NUM * (fileCount - 1) + 1).Value = fso.GetFileName(myFile)
Set myStream = fso.OpenTextFile(myFile, ForReading)
lineCount = 0
Do Until myStream.AtEndOfStream
myLine = myStream.ReadLine
lineCount = lineCount + 1
data = Split(myLine, ",")
Dim i As Long
For i = 0 To COL_NUM - 1
buf(lineCount - 1, i) = CDbl(data(i))
Next
Loop
myStream.Close
Set myStream = Nothing
Range(Cells(2, COL_NUM * (fileCount - 1) + 1), Cells(ROW_NUM + 1, COL_NUM * fileCount)) = buf
Application.StatusBar = fileCount & "個目完了"
DoEvents
End If
Next
Set myFiles = Nothing
Set fso = Nothing
' 最終列に平均値を入力する
Application.StatusBar = "平均を計算します"
Dim averageRow As Long
Dim averageAddress As String
averageRow = COL_NUM * fileCount + 1
averageAddress = Range(Cells(2, 1), Cells(2, averageRow - 1)).Address(RowAbsolute:=False)
Cells(1, COL_NUM * fileCount + 1).Value = "average"
With Cells(2, averageRow)
.Value = "=AVERAGE(" & averageAddress & ")"
.AutoFill Destination:=Range(Cells(2, averageRow), Cells(ROW_NUM + 1, averageRow))
End With
Application.StatusBar = False
End Sub

No.2
- 回答日時:
perlかrubyでならその処理を行うスクリプトを提示することは可能です。
但し、あなたのパソコンにperl又はrubyがインストールされていないなら、それをインストール
する必要があります。
もし、希望するなら、その旨、補足ください。
その場合、言語(perlかruby)、言語のバージョンも明記ください。
尚、以下の仕様で作成しますが、問題ないですか?
1.対象となるファイルは、拡張子が.CSVとする。かつ、それらのファイルは1つのフォルダ内に
全件ファイル格納されている。
2.横に並べる順番は、ファイル名順(アルファベット順、大文字、小文字区別有)とする。
3.出力ファイルは、OUT.TXTとする。(OUT.CSVとすると2回目にこのファイルを処理してしまう為)
excelに読み込む場合は、リネームが必要。
No.1
- 回答日時:
自分ならバッチファイルで結合する。
forコマンドに/fオプションを付けて1行ずつ読み込み、それを結合したいファイルの1行ずつ読み込んだテキストにカンマを付けて新たに「結合したファイル」を出力する。
それを最終行まで行い、さらに次のファイルを「結合したファイル」に結合…を繰り返す。
CSVファイル中に空白文字が含まれていなければ処理は簡単です。
空白文字が含まれる場合はforコマンドにデリミタを設定して1行全部読み込めるようにします。
・・・
と、VBAではないので実際のバッチファイルは示さずに回答してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「営業秘密の漏洩」について
-
.NETアプリを作ったときの .man...
-
アクセス 壊れた? 「ファイ...
-
exeファイルを開こうとすると「...
-
公文書のxmlファイルの開き方が...
-
コマンドプロンプトで作成日時...
-
#include <Windows.h>というヘ...
-
exeファイルの中身を見る方法は...
-
バッチ処理で追記コピーしたい
-
Seasar2のdiconファイルの読み方
-
Latexで図番号だけを「図1.1」...
-
ファイル圧縮形式の変更について
-
VB6.0でFTPでのファイルの送受信
-
CSVから指定行だけを読み込み
-
リンクの張り付けかたを教えて...
-
監視ツールを入れさせられまし...
-
Matlab/ @の意味
-
exeファイルをデータ転送サービ...
-
JSPが表示されない
-
VB6.0 PowerPointの開閉
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#include <Windows.h>というヘ...
-
コマンドプロンプトで作成日時...
-
アクセス 壊れた? 「ファイ...
-
binファイルを解凍したいの...
-
.NETアプリを作ったときの .man...
-
リンクの張り付けかたを教えて...
-
Latexで図番号だけを「図1.1」...
-
jarファイル
-
監視ツールを入れさせられまし...
-
自分で作成した重要ファイルを...
-
コマンドプロンプトで、指定し...
-
C言語---ファイルに出力したデ...
-
公文書のxmlファイルの開き方が...
-
「ブルーファイル」と「グリー...
-
HTMLからのBATファイル実行
-
CSVから指定行だけを読み込み
-
ファイルが開かれているかどう...
-
warファイルをEclipseでプロジ...
-
exeファイルの中身を見る方法は...
-
VB6 でSSH接続がしたい
おすすめ情報