人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

csvファイルで、特定の行のみ削除する簡易な方法について質問致します。

今、約10万行×500列(コンマ区切り)のcsvファイルがあります。
特定の行を削除したいのですが、削除したい行は複数(数千)あります。
行番号は全てわかっています。

申し訳ないですが、ExcelやAccessを用いないで削除を実現する簡易な方法
をご教授頂ければ幸いです。
(コマンドプロンプト等はOK、フリーソフトは数十?百MBのcsvファイルでも
問題なく動いてくれればOK、その他いい方法があれば何でも!)

どうぞよろしくお願い致します。


●質問者: yoshifuku
●カテゴリ:コンピュータ
✍キーワード:access CSV Excel MB コマンドプロンプト
○ 状態 :終了
└ 回答数 : 3/4件

▽最新の回答へ

1 ● chyopper
●50ポイント ベストアンサー

以下のスクリプトをtest.vbsで保存

コマンドプロンプトでスクリプトを実行します。

c:\>cscript test.vbs

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
 Const ForReading = 1, ForWriting = 2, ForAppending = 8
 Set objInput = objFSO.OpenTextFile("test1.csv", ForReading) ' 入力csv
 Set objOutput = objFSO.OpenTextFile("test2.csv", ForWriting, True) ' 出力csv

 Do Until objInput.AtEndOfStream ' 入力ファイルの終端まで繰り返し
 srhFlg = 1 
 strLine = objInput.ReadLine ' 入力ファイルを1行読み込む

 Set objMask = objFSO.OpenTextFile("del.txt", ForReading) ' 削除行入力ファイル
 Do Until objMask.AtEndOfStream 
 strMask = objMask.ReadLine
 
 If StrComp(objInput.line-1, strMask ) = 0 Then '入力ファイルと削除行の比較 
 srhFlg = 0 
 End If
 Loop

 If srhFlg = 1 Then ' 指定行は出力しない 
 objOutput.WriteLine strLine
 End If
 srhFlg = 1

 Loop

objInput.Close
objOutput.Close 
objMask.Close

削除行の指定はdel.txtに記入します。

1
3
29
◎質問者からの返答

ありがとうございます!上手くいけそうです。いるか贈ります!


2 ● lizy
●15ポイント

スクリプト(JScript)を使うというのはアリでしょうか。

var stdin = WScript.StdIn;
var stdout = WScript.StdOut;

while (!stdin.AtEndOfStream) {
if (isDeleteLine(stdin.Line)) {
stdin.SkipLine();
} else {
stdout.WriteLine(stdin.ReadLine());
}
}

function isDeleteLine(line) {
// とりあえず3行目を削除
return line == 3;
}

これを例えばremove.jsという名前で保存して以下のように実行すれば結果が得られます。

> cscript //nologo remove.js < input.csv > output.csv

ただ削除する行が多数になるようですので、指定方法を工夫する必要があるかもしれません(削除する行番号を書いたファイルを別途用意して、それで初期化するなど)

まあスクリプト内に削除する全行番号を書いてしまうことも不可能ではありませんがw

◎質問者からの返答

ありがとうございます!やってみます!


3 ● TREEG
●15ポイント

私も時々数百Mから1GB近いデータを扱いますが、perlをインストールして、perlでスクリプトを動かすのが一番楽だと感じています。

ちなみに、perlですと、こんな感じでできます。データ処理はMem-Ramなどに置いておくと早いですね。

#以下、kaiseki.plとしてファイルを作成して、解析したいCSVをtext.csvとする。perlのインストールがあれば、ダブルクリックで実行されます。

#削除したい行は、__DATA__の下に書く。例だと、1,4,10行を削除してくれる

my %line;

for(<DATA>){chomp;$line{$_}=1;}

my $f; my $w;my $cnt;

open($w,">>result.csv");

open($f,"<text.csv");</p>

while(<$f>){$cnt++;if($line{$cnt}){next;}print $w $_;}

close($f);

close($w);

__DATA__

1

4

10

◎質問者からの返答

ありがとうございます!perlをインストールしていないのですが、機会があれば朝鮮します。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ