[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『列の削除(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)
どうもありがとうございます!エラーは出ず、希望するフォーマットで出ました!
しかし元データの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)
あらら、そうですか。 それは VBS の仕様かもしれません。
多分、十分なメモリがあれば動作するとは思いますが(仕様上の上限は 2Gだったかな)、 おそらく読めなかったのでしょう。
Seiya さんの方法でできているなら、そちらをご使用ください。 (Mook)
> 質問@ 9列あるうち、右側5列のデータは不要なので削除したいのですが、エクセルのマ クロでで >きないでしょうか?csvファイルで、これらはすべてカンマで区切ら れています。
> 質問A また、右側5列を削除してから、2列目と3列目の間に新しい列を1列作り、1200万行すべてに0と入れたいのですが、このようなこともマクロでできるのでしょうか?是非とも教えてください!!お願いします。
ということでしたよね?
temp = Join(x,",") & vbCrLf にしてください。 コードを変更しておきました。 (seiya)
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.