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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#include <Windows.h>というヘ...
-
binファイルを解凍したいの...
-
アクセス 壊れた? 「ファイ...
-
バッチ処理で追記コピーしたい
-
ファイルが開かれているかどう...
-
既に開いているエクセルを閉じ...
-
実行ファイル(.exeファイル)...
-
Word VBA MSGBOX 内で降順表示
-
iniファイル
-
exeファイルをデータ転送サービ...
-
公文書のxmlファイルの開き方が...
-
「ブルーファイル」と「グリー...
-
jarファイル
-
frm、frxファイル
-
【VBA】EXCELブックを開かずに...
-
C言語---ファイルに出力したデ...
-
WININET.DLL FtpCommand(TYPE)...
-
.NETアプリを作ったときの .man...
-
reaper音声ファイルについて
-
ハッシュ値を取る時はファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アクセス 壊れた? 「ファイ...
-
#include <Windows.h>というヘ...
-
Latexで図番号だけを「図1.1」...
-
binファイルを解凍したいの...
-
.NETアプリを作ったときの .man...
-
ファイル構造が破損しているフ...
-
2つのファイルのバイナリをコン...
-
CSSを1ページに1枚作るのって変...
-
Word VBA MSGBOX 内で降順表示
-
公文書のxmlファイルの開き方が...
-
jarファイル
-
バッチ処理で追記コピーしたい
-
自分で作成した重要ファイルを...
-
ファイルは何で構成されている...
-
exeファイルをデータ転送サービ...
-
リンクの張り付けかたを教えて...
-
exeファイルの中身を見る方法は...
-
参照するファイルをワイルドカ...
-
CRCが一致する確率
-
C言語---ファイルに出力したデ...
おすすめ情報