2016-08-02 6 views
1

この質問はインタビューで尋ねられ、スタックオーバーフローがこれに尋ねるのが正しいかどうかはわかりません。50000のhtmlファイルから行を削除する方法

50000のhtmlファイルでは、すべての電話番号を削除する必要があります。

私は答えました、私はファイルを読んで、解析し、フィルタリング後に電話番号のない別のファイルを書きます。

例:

while (line = br.readline != null) { 
    if line does not have phone number 
     write line to another file. 
} 

また、我々は、50000個のファイルを持っていたことから、マルチスレッドの要素が関与すべきか?

もっと良いアイデアを教えてください。標準的なソリューションですか?

+1

perlはこれを簡単に作成します:http://technologiesos.com/2009/05/21/perl-pie-if-you-only-learn-how-do-one-thing-perl-it.html – Owen

+0

'line'は' br.readline'( 'string')または' br.readline!= null'( 'boolean')に設定されていますか? –

+0

'sed'は恐らくperlの解決策に匹敵するでしょう。 –

答えて

5

インタビューの質問ことを行うには、小さなシェルスクリプトは、2つの主要な種類があります。この質問は2番目の種類のように聞こえる。

  • それは、電話番号のすべてのインスタンスをキャッチするつもりです:あなたは溶液を得たら

    は、インタビュアーは、おそらくあなたのコードについての詳細な質問をすべきか? - 「はい」と思われるかもしれません。

  • 複数の行にまたがる電話番号はどうなりますか? HTMLは気にしない、そう? - 電話番号に対応するようにソリューションを変更する方法を説明してください。
  • 途中でHTMLタグを使用して電話番号をキャッチしますか? - マークアップを処理するソリューションを変更する方法を説明する必要があります。このパーサーを正しく実行するには、HTMLパーサが便利です。
  • ファイルの20%に電話番号が含まれているとしたらどうなりますか? - プログラムがI/Oバウンドになること、そして書き込みを開始する前に最初のオカレンスを検索して書き込みを最適化する方法を説明する必要があります。

会話は続けてもかまいません。結局、インタビュアーは、HTML、ファイルI/O、文字列処理の分野であなたのスキルをかなりよく理解しているはずです。良い答えはおそらく上記の技術の大部分を含むでしょう。

+1

これは素晴らしい答えです。問題のI/O境界に関する点については、ディスクの数(各ディスクとコントローラあたりのコアが最大速度に達することができる以上の場合)を考慮すると、パフォーマンスはスケーラビリティに比例する可能性があります。 1つのディスクにつき1つのファイルを読み取り、別のディスクに書き込むか、大きなバッファを使用するか、ソリッドステートディスクを使用してシーク時間を最小限に抑えます。 – Gene

+0

「20%のファイルに電話番号が含まれているとどうなるでしょうか」 - ファイルに部分文字列が含まれているかどうか*迅速に判断できますか?私は気にしないと私はまだこのファイルが実際に番号が含まれているかどうかを迅速に判断することができないため、ファイルの100%の完全なプロセスを行うだろうと言う。しかし、もしそうでなければ、私は同じ内容のファイルを書きません。 – Vesper

+0

@Vesperそれはすぐには判別できないので、とにかく解析する必要があります。アイデアは、50Kの読み取り+ 50Kの書き込み(常にあなたが読んで書く)、または60Kの読み取り+ 10Kの書き込み(電話番号が2回ある各ファイルを読むが、電話が見つかった場所のファイルのみを書き込む)を議論することでした。 – dasblinkenlight

1

慎重に、今の息子、

ない、私はええとfnr.exeが、それはHTMLでどのようなあなたの所見を示しを確認するようなアプリを取得、そのために自分のアルゴリズムを使用することはありません、代替のプレビュー/削除とファイル数:です。信頼できると速い。その操作を行う

を元に戻すことがミサイルを起動するようあり、それは質問のようなもので、雇用主は、いくつかのフラグをスローする必要があり、あなたは何をするつもり何のプレビューとバックアップを持っている方が良いでしょう。それとも、私はあまりにも慎重です。

1

私は崇高な状態でフォルダを開いてから、findを実行して、フォルダ内のすべてのファイルをすべて正規表現で置き換えます。その後、それらをすべて保存します。

崇高なテキスト内のすべてのファイルと
  • オープンフォルダ3
  • 電話番号を識別するために、検索や正規表現を使用してファイルに置き換える
  • すべて保存
1

面接があるかもしれないことがあります例えば、Javaをまったく使用していないなど、すぐに使える答えを期待しています。 Javaプログラムを作成する場合は、既に使用可能な多くのツールで既に行われている、多くのエッジケースを処理する必要があります。特定の技術のあなたの知識をテストするためのもの、そしてあなたの思考プロセスを学ぶもの - ここ

for FILE in `ls myDir` 
do 
    grep -h -v "myPattern" $FILE > $FILE 
done 
関連する問題