アプリ版:「スタンプのみでお礼する」機能のリリースについて

CSVファイルで100個のファイル数(各ファイル3列×50000行)を1つのexcelシートに結合させる方法を探しています。
結合させる際に各データを横に結合させ、最終的に各行の平均を算出させたいです。
データ数が多いため、これまでコピー→貼り付けを1つずつし、各行をexcel関数で平均算出をさせていたのですが、時間がかかってしまうのでプログラム等で出来ないかと思っています。

横に結合(貼り付け)作業だけでもVBAなどで出来るという話を聞いたのですが、イマイチわからないので教えて頂けたら幸いです。

A 回答 (4件)

以前の質問ですと


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

となっていて、各列の平均を求めたいとありますが、この件とは別件なのでしょうか?
今回の質問で、求めたいのは、各行の平均で間違いないですか?
「ファイルの結合についてお願いします。」の回答画像4
    • good
    • 0

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
    • good
    • 0

perlかrubyでならその処理を行うスクリプトを提示することは可能です。


但し、あなたのパソコンにperl又はrubyがインストールされていないなら、それをインストール
する必要があります。
もし、希望するなら、その旨、補足ください。
その場合、言語(perlかruby)、言語のバージョンも明記ください。

尚、以下の仕様で作成しますが、問題ないですか?
1.対象となるファイルは、拡張子が.CSVとする。かつ、それらのファイルは1つのフォルダ内に
全件ファイル格納されている。
2.横に並べる順番は、ファイル名順(アルファベット順、大文字、小文字区別有)とする。
3.出力ファイルは、OUT.TXTとする。(OUT.CSVとすると2回目にこのファイルを処理してしまう為)
excelに読み込む場合は、リネームが必要。
    • good
    • 0

自分ならバッチファイルで結合する。


forコマンドに/fオプションを付けて1行ずつ読み込み、それを結合したいファイルの1行ずつ読み込んだテキストにカンマを付けて新たに「結合したファイル」を出力する。
それを最終行まで行い、さらに次のファイルを「結合したファイル」に結合…を繰り返す。

CSVファイル中に空白文字が含まれていなければ処理は簡単です。
空白文字が含まれる場合はforコマンドにデリミタを設定して1行全部読み込めるようにします。

・・・
と、VBAではないので実際のバッチファイルは示さずに回答してみます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!