
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- Excel(エクセル) Excel同士のデータの突合 3 2023/08/07 16:34
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- 統計学 お世話になっています. x軸は時間(期間)y軸はある値に対する2つのグラフ比較をしますが、私個人の考 2 2023/03/30 11:42
- Excel(エクセル) Excel使用前提 同じフォルダ内にあるファイルの集約等をマクロでできますか 4 2022/09/06 19:03
- Excel(エクセル) マクロか関数で処理したいのですが、教えて頂けませんか。 8 2022/10/31 15:18
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Excel(エクセル) Excel、同じフォルダ内のExcelファイルの特定シートのみを1つのファイルに集約したい 8 2022/09/07 15:12
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#include <Windows.h>というヘ...
-
コマンドプロンプトで作成日時...
-
アクセス 壊れた? 「ファイ...
-
Latexで図番号だけを「図1.1」...
-
<ファイル3>を開いた時に、<フ...
-
PowerPoint ファイルの結合につ...
-
ヘルプファイルの作り方
-
フォームで入力したテキストを...
-
jarファイル
-
監視ツールを入れさせられまし...
-
ファイル名にドットを使ったフ...
-
.NETアプリを作ったときの .man...
-
binファイルを解凍したいの...
-
exeファイルの中身を見る方法は...
-
CSVから指定行だけを読み込み
-
JSPが表示されない
-
大容量のファイルをseek関数で...
-
ADODB.Streamで開いたファイル...
-
ゲームの中身を見てみたい
-
リンクの張り付けかたを教えて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
binファイルを解凍したいの...
-
アクセス 壊れた? 「ファイ...
-
コマンドプロンプトで作成日時...
-
.NETアプリを作ったときの .man...
-
リンクの張り付けかたを教えて...
-
#include <Windows.h>というヘ...
-
Latexで図番号だけを「図1.1」...
-
jarファイル
-
「ブルーファイル」と「グリー...
-
ファイルが開かれているかどう...
-
バッチ処理で追記コピーしたい
-
VBAのバイナリ出力について
-
公文書のxmlファイルの開き方が...
-
コマンドプロンプトで、指定し...
-
監視ツールを入れさせられまし...
-
自分で作成した重要ファイルを...
-
HTMLからのBATファイル実行
-
VBSが起動しない
-
他のMDBのマクロを実行する方法
-
Batファイルをバイナリ形式にす...
おすすめ情報