[[20071202012740]] 『列の削除(CSVファイル内のカンマで区切)』(にっか) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『列の削除(CSVファイル内のカンマで区切)』(にっか)

はじめまして。手作業でやる手間をどうしても省きたくて質問しにきました。
ぜひご教授願います。新参者ですが、どうかよろしくお願いします。

csvファイルの中に9列、1200万行が入った数字データがあります。
エクセルでは全部開けず、em-editorでしか開けませんでした。(1.5Gあります)
そこで・・・

質問@ 9列あるうち、右側5列のデータは不要なので削除したいのですが、エクセルの    マクロでできないでしょうか?csvファイルで、これらはすべてカンマで区切ら    れています。

質問A また、右側5列を削除してから、2列目と3列目の間に新しい列を1列作り、     1200万行すべてに0と入れたいのですが、このようなこともマクロでできるので    しょうか?是非とも教えてください!!お願いします。

データの例(元のデータ)

25, 95, 56, -65, 98, -25, 65,-98, -33

21, -65, -654, 54, 65, -25, 133, 1

654, 65, 321, 45, 32, 87, -65, 45, 78

65, 456, 95, 32, 78, 65, 46, -46, 21

 .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .
 .   .   .   .   .   .   .   .   .

データの例(処理後のデータ)

25, 95, 0, 56, -65

21, -65, 0, -654, 54

654, 65, 0, 321, 45

65, 456, 0, 95, 32

 .   .   .   .   . 
 .   .   .   .   . 
 .   .   .   .   .   
 .   .   .   .   .   
 .   .   .   .   .

 時間はかかると思いますよ?

 Sub test()
 Dim txt As String, temp As String, myDir As String, x
 myDir = "c:\"  '<- 要変更(フォルダ)
 Open myDir & "test.csv" For Input As #1  ' test.csv を実際のファイル名に変更
 Do While Not EOF(1)
      Line Input #1, txt
      x = Split(txt,",")
      If UBound(x) > 4 Then
          ReDim Preserve x(4)
          For i = 4 To 2 Step - 1
              x(i-1) = x(i)
          Next
          x(2) = 0
          temp = temp & vbCrLf & Join(x,",")
      End If
 Loop
 Close #1
 Open myDir & "test2.csv" For Output As #1
      Print #1, Mid$(temp,2)
 Close #1
 End Sub
 (seiya)

 1200000行?
 こっちのが無難かも...

 Sub test()
 Dim txt As String, temp As String, myDir As String, x
 myDir = "c:\"  '<- 要変更(フォルダ)
 Open myDir & "test.csv" For Input As #1  ' test.csv を実際のファイル名に変更
 Do While Not EOF(1)
      Line Input #1, txt
      x = Split(txt,",")
      If UBound(x) > 4 Then
          ReDim Preserve x(4)
          For i = 4 To 2 Step - 1
              x(i-1) = x(i)
          Next
          x(2) = 0
          temp = vbCrLf & Join(x,",") & vbCrLf
          Open myDir & "test2.csv" For Append As #2
              Print #2, temp
          Close #2
      End If
 Loop
 Close #1
 End Sub
 (seiya)


seiya様
ご返信いただきどうもありがとうございました!
しかし、5行目にエラーが出てしまうようなのですが・・・

 Do While Not EOF(ff)
というところです。
何か私の設定するところがあるのでしょうか?
フォルダはc:\に設定しました。


 ff - > 1 に変更してください。
 コード変更しました。
 (seiya)

 こちらのが良いかも...

 Sub test()
 Dim txt As String, temp As String, myDir As String, x
 myDir = "c:\"  '<- 要変更(フォルダ)
 Open myDir & "test2.csv" For Append As #2
     Open myDir & "test.csv" For Input As #1  ' test.csv を実際のファイル名に変更
     Do While Not EOF(1)
         Line Input #1, txt
         x = Split(txt,",")
         If UBound(x) > 4 Then
             ReDim Preserve x(4)
             For i = 2 To 3  '<-- 変更
                 x(i+1) = x(i) '<- 変更
             Next
             x(2) = 0
             temp = Join(x,",") & vbCrLf '<-変更
             Print #2, temp
          End If
     Loop
 Close #1
 Close #2
 End Sub
 (seiya)

seiya様

どうもありがとうございます!エラーは出ず、希望するフォーマットで出ました!
しかし元データの1列目と4列目は残っていて、2列目と3列目の間に0が追加されたのですが、
新しく作られたデータの2列目、3列目、4列目のデータがすべて5列目と同じデータになっています。
また、行と行の間に空白の2行ができています。
もう少しでという感じなのですが、どうか再度よろしくお願いいたします。。
本当に感謝します。


 下からお邪魔します。
 解答の対象外なら、読み飛ばしてください。

 ここでは少し邪道ですが、VBS の例です。
 このメリットは、EXCEL がインストールされていない Windows でも実行できることですね。
 下記をnotepadにでもコピーし、4行目と5行目を適切なファイル名にし、ファイルを
 convert.vbs などで保存し、実行(ダブルクリック)してみてください。
 -----------------------------------
 Const FOR_READING = 1
 Dim fs, inf, outf, ar
 Set fs =  CreateObject("Scripting.FileSystemObject")
 Set inf  = fs.OpenTextFile( "D:\Data\in.csv", FOR_READING )  '*** 入力ファイル
 Set outf = fs.CreateTextFile( "D:\Data\out.csv", true )      '*** 出力ファイル
 Do While inf.AtEndOfLine <> True
     ar = split( inf.ReadLine, "," )
     outf.WriteLine ar(0) & "," & ar(1) & ",0," & ar(2) & "," & ar(3)
 Loop
 inf.Close
 outf.Close
 -----------------------------------
 EXCEL の学校なので、校則違反かもしれませんが、ご参考まで。
 一応 VBA で実行する場合は、前後に Sub xxx と End Sub で囲めばそのまま動くかと思います。
 (Mook)

Mook様
ありがとうございます.
小さいサイズのファイルですとできたのですが,サイズの大きいファイルでは実行時エラーが出てしまいました.何か変更箇所がありますでしょうか?
(にっか)

 あらら、そうですか。
 それは VBS の仕様かもしれません。

 多分、十分なメモリがあれば動作するとは思いますが(仕様上の上限は 2Gだったかな)、
 おそらく読めなかったのでしょう。

 Seiya さんの方法でできているなら、そちらをご使用ください。
 (Mook)

 > 質問@ 9列あるうち、右側5列のデータは不要なので削除したいのですが、エクセルのマ クロでで >きないでしょうか?csvファイルで、これらはすべてカンマで区切ら れています。 

 > 質問A また、右側5列を削除してから、2列目と3列目の間に新しい列を1列作り、1200万行すべてに0と入れたいのですが、このようなこともマクロでできるのでしょうか?是非とも教えてください!!お願いします。

 ということでしたよね?

 temp = Join(x,",") & vbCrLf
 にしてください。
 コードを変更しておきました。
 (seiya)


Mook様

Mook様の先ほどの文字列をseiya様のところにいれたところついに1.5GBのデータを処理することができました!
しかしそれぞれのデータの間に1行づつ空白の行ができてしまうのですが・・・
これはどうしようもないですか?

Sub test()

 Dim txt As String, temp As String, myDir As String, x
 myDir = "c:\"  '<- 要変更(フォルダ)
 Open myDir & "test2.csv" For Append As #2
     Open myDir & "test.csv" For Input As #1  ' test.csv を実際のファイル名に変更
     Do While Not EOF(1)
         Line Input #1, txt
         x = Split(txt,",")
        If UBound(x) > 4 Then
             Print #2, x(0) & "," & x(1) & ",0," & x(2) & "," & x(3) & vbCrLf
         End If
     Loop
 Close #1
 Close #2
 End Sub

seiya様

度々すみません.いつもありがとうございます.
やはり新しくできるファイルの2,4,5列目の数字が同じものとなってしまうようです.
(にっか)


 Append なので
 Print #2, x(0) & "," & x(1) & ",0," & x(2) & "," & x(3)
 最後の改行コードは要りませんね。
 (seiya)


 Em-Editorで、^*,*,*,*,*,*,*,*,*$を^*,*,0,*,*$に置換するだけのような気がしないでも。

 MS Accessを使っていいなら、こんな感じ。[ファイル]-[外部データの取り込み]メニューで、インポートするCSVファイルを指定。
インポートウィザードが起動したら、設定ボタンをクリックして、取り込みたくないフィールドに対し[スキップ]チェックボタンをオンに設定。
で、インポートを実行して、新規テーブル甲へインポートします。別個に、テーブル乙を作成して、field1に、0と入力しておきます。

あとは、クエリを作成して実行結果を[ファイル]-[エクスポート]。クエリはこんな感じ。

select 甲.field1, 甲.field2, 乙.field1, 甲.field3, 甲.field4 from 甲, 乙;
(まーまあ)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.