「覚え間違い」を教えてください!

こんにちは

Excelにてcsv保存を行う際、
 A B C D
 E F
 G H
(スペースはセルが違うと思ってください)
このようなデータを保存すると、
 A,B,C,D
 E,F,,
 G,H,,
の状態でファイルが出来上がりますが、
下のように2,3行目の後半のカンマがない状態で保存する簡単な方法はないでしょうか?
 A,B,C,D
 E,F
 G,H
同じフォーマットで、もっと行数の多いファイルを大量に扱うのに、
データ量削減のため、不要な部分はできるだけ減らしたい。

以下処置は可能ですが、保存方法やその他工夫でできないか教えてください。
① マクロで一行づつ、テキストファイルに書き込む。
② ヘッダーを除く部分でcsvファイルを作成し、後からヘッダー部分だけマクロから書き込む。
  (一連の作業はマクロで実施)

保存時のオプションで指定できればベストです。

よろしくお願いいたします。

質問者からの補足コメント

  • うれしい

    初期想定しておりました オプション等の処理は難しいようでしたが、Tool, Codeをご提案いただきました WindFaller さんのご回答をベストアンサーとさせていただきます。
    ありがとうございました。

      補足日時:2016/06/11 00:40

A 回答 (3件)

こんにちは。


#2の回答者です。

>ものによりますが1.3倍ほどになるのでできれば、、、といったところですね。
>ヘッダーが6列、データが3列の2000~5000、一日に3000ファイルほど吐き出しています。

私が想像していたのは、巨大なCSVファイルを考えていました。しかし、まさか、数で来るとは思いませんでしたね。

一日に3000ファイルほど? →1.3倍 ->[ファイルサイズの問題に発展]
もちろん、SHIFT-JISですよね。

カンマだけの問題ではなさそうな気がします。
CSVファイル生成には、問題は発生していないとしても、処理は、CSV生成時にということになるでしょうね。それも、完全自動化しなければ、3,000ファイルなどの処理ができるはずもありません。

とりあえず、最初の第一案から、マクロを提示します。

ツールを使う方法は、どうしても一括処理ということを考えます。しかし、何が問題かというと、ファイル名の決定方法と、タイム・スタンプの問題があります。それを変更しないようにするのではないかと思うと、また別なテクニックが必要になります。

以下は、A1からデータがあることを想定したマクロです。
'//
Sub MakingCSV()
  Dim LastRow  As Long
  Dim LastCol As Long
  Dim Rng As Range
  Dim buf As String
  Dim fNo As Integer
  Dim fn As String
  Dim i As Long, j As Long
  
  fn = ThisWorkbook.Path & "\Test1.csv"  'ファイル名
  fNo = FreeFile()
  Set Rng = ActiveSheet.Range("A1").CurrentRegion
  LastRow = Rng.Cells(Rng.Cells.Count).Row
  Open fn For Output As #fNo
  For i = 1 To LastRow
    LastCol = Rng.Cells(i, Columns.Count).End(xlToLeft).Column
    For j = 1 To LastCol
       buf = buf & "," & Rng.Cells(i, j).Text
       DoEvents
    Next j
     Print #fNo, Mid$(buf, 2)
     buf = ""
  Next i
  Close #fNo
  MsgBox "終了", vbInformation
 End Sub
    • good
    • 2
この回答へのお礼

回答ありがとうございます。
コードまで用意いただいて・・・!

形式は・・・Shift-JISのはず。気にしていなかったです。
>カンマだけの問題ではなさそうな気がします。
すみません、懸念点が不明ですが、容量が増えすぎでは?ということであれば、
Excelでの1セル分のデータはそれぞれ2文字程度なので、
余分なし(3列)→一行 8文字
余分あり(6列)→一行 11文字
になるのでそんなものかなと。

タイムスタンプはとりあえず気にしていないですね。
ファイル名と中身がしっかりしていればOKなので。

提示いただいたコードは質問文に記載させていただいた①の処置になりますね。
ファイル名は別途リスト化されているのでfor next かLoopかでくくって、順次代入すればこのコードでも十分動作には問題ありません。

あと、申し訳ありませんが、はじめの回答でいただいたツールについては、
諸事情によりPCにソフトその他インストールが禁止されているのでひとまず見送らせていただきます。

ありがとうございます。

お礼日時:2016/06/08 22:14

こんばんは。



通常、CSVは、四角に囲まれた範囲を出力するために、そのようなカンマが入りますが、それほど負担になるものなのでしょうか。

>2,3行目の後半のカンマがない状態で保存する簡単な方法はないでしょうか?

このようなことは、マクロで作るのは大した問題ではありません。今、試しに3種類のマクロを作ってみましたが、ファイルの大きさを気にするようなものより、もはや、CSVを吐き出す時間の問題です。

>データ量削減のため、不要な部分はできるだけ減らしたい。

1行につき、カンマ2つを減らすとして、例えば、50,000行あるとすれば、カンマ1つで、2byte * 2 =4byte , 5万行* 4byte =200,000 byte, これをキロバイトに直すと、約195kbyte になります。

郵政省のZipCodeファイルは、そのような無駄なカンマは存在しませんが、123,734行あり、16列ほどあります。このファイルの大きさは、123,734行で、12.4Mbyte だから、それが、たとえ、1割の1M 違っていても、全体的に、そこまで追求する人は、DOSの時代ならともかく、現代では考える人が少ないのではないでしょうか。

もう少し、なぜ、そうせざるを得ないか、よくわからないのです。

それでも、という場合は、外部ツール(Basp21)を使ってよければ、公開します。他で、Excelの組み込み型のツールは知らないからですが、そうでないと、ちょっと私には難しいような気がします。

http://www.hi-ho.ne.jp/babaq/basp21.html
Bsmtp20070629-587.lzh(119KB) 2007/06/29
(これで何をするかというと、正規表現置換をするわけです。つまり、簡単にするなら、高性能のテキストエディタの正規表現の置換でも、可能です。)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

実際ファイルでは、ヘッダーが6列、データが3列の2000~5000、一日に3000ファイルほど吐き出しています。
ものによりますが1.3倍ほどになるのでできれば、、、といったところですね。
一ファイルの保存スピードも求めていないのでマクロ組んでも良いのですが、簡易にできる方法があれば作る前に知っておきたく、色々検索しています。

ツールご紹介ありがとうございます。確認させて頂きます。

お礼日時:2016/06/07 09:18

そんな都合のよい保存オプションはなさそうなので、自力で編集することになるでしょう。


マクロですが、「新規にブックを作成し、そのシートのA列にカンマを付けて編集したものを保存」が簡単だと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
やはりプログラム書かないとダメそうですね、、、
ありがとうございました!

お礼日時:2016/06/07 09:04

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A