2

フォルダ内のテキスト ファイルを 1 行ずつ読みたい。1 txt の例:

Fast and Effective Text Mining Using Linear-time Document Clustering
Bjornar Larsen WORD2 Chinatsu Aone
SRA International AK, Inc.
4300 Fair Lakes Cow-l Fairfax, VA 22033

{bjornar-larsen, WORD1

word単語 = 、word2word3を含まず、ドットで終わらない行を削除したい.

それで。例から、結果は次のようになります。

Bjornar Larsen WORD2 Chinatsu Aone
SRA International, Inc.
{bjornar-larsen, WORD1

混乱しています。行を削除するにはどうすればよいですか? それは可能ですか?または、それらをスペースに置き換えることはできますか?

コードは次のとおりです。

$url = glob($savePath.'*.txt');
foreach ($url as $file => $files) {
    $handle = fopen($files, "r") or die ('can not open file');
    $ori_content= file_get_contents($files);
    foreach(preg_split("/((\r?\n)|(\r\n?))/", $ori_content) as $buffer){
        $pos1 = stripos($buffer, $word1);
        $pos2 = stripos($buffer, $word2);
        $pos3 = stripos($buffer, $word3);
        $last = $str[strlen($buffer)-1];//read the las character
        if (true !== $pos1 OR true !== $pos2 OR true !==$pos3 && $last != '.'){
        //how to remove
        }
    }
}

私を助けてください、どうもありがとう:)

4

5 に答える 5

2

!== trueの戻り値をテストするために比較を使用していますstripos!== true「ブール値 true と絶対的に等しくない」ことを意味します。stripos単語が存在しない場合を除き、の戻り値は数値falseです。つまり、条件は常に false です。

=== false代わりに使用するには、更新してみてください。また、ORそれぞれの間に使用しています。あなたの例は、それらの1つだけを含める必要があることを示しています-したがって、「それらのどれも見つからなかった」ことを確認している場合は&&、すべてに使用する必要があります:

if (($pos1 === false) && ($pos2 === false) && ($pos3 === false) && ($last != '.'))

「行を削除する方法」に関しては、保持したいすべての行のリストを保持する必要があります。つまり、実際には上記の条件を反転!== falseして使用し、||すべての間で使用する必要があります (任意のルールに一致するすべての行を保持する必要があるため)。

次のようなことを試してください:

$url = glob($savePath.'*.txt');
foreach ($url as $file => $files) {
    $handle = fopen($files, "r") or die ('can not open file');
    $ori_content= file_get_contents($files);
    $linesToKeep = array(); // list of all lines that match our rules
    foreach(preg_split("/((\r?\n)|(\r\n?))/", $ori_content) as $buffer){
        $pos1 = stripos($buffer, $word1);
        $pos2 = stripos($buffer, $word2);
        $pos3 = stripos($buffer, $word3);
        $last = $str[strlen($buffer)-1];

        if (($pos1 !== false) || ($pos2 !== false) || ($pos3 !== false) || ($last == '.')) {
            $linesToKeep[] = $buffer; // save this line
        }
    }
    // process list of lines for this file;
    // file_put_contents($files, join("\r\n", $linesToKeep)); // write back to file
    // $lines = join("\r\n", $linesToKeep); // convert to string to manipulate
}

これで、ルールセットに一致するすべての行が$linesToKeep配列に含まれます。これを で文字列に戻す$lines = join("\r\n", $linesToKeep);か、繰り返し処理して好きなように処理することができます。

于 2012-09-30T05:28:50.517 に答える
1

良いアプローチ...しかしarrays、ファイルを読み込んでファイルに置くために使用できます。今までは大丈夫です。

PS:もっと良い方法があるかもしれません...

$url = glob($savePath.'*.txt');
foreach ($url as $file => $files) {
    $handle = fopen($files, "r") or die ('can not open file');
    $ori_content= file_get_contents($files);

    # Declare a variable array to store the contents.
    $fileContents = array();

    foreach(preg_split("/((\r?\n)|(\r\n?))/", $ori_content) as $buffer){
        $pos1 = stripos($buffer, $word1);
        $pos2 = stripos($buffer, $word2);
        $pos3 = stripos($buffer, $word3);
        $last = $str[strlen($buffer)-1];//read the las character
        if (($pos1 !== false) || ($pos2 !== false) || ($pos3 !== false) || ($last == '.')){
            $fileContents[] = $buffer;
        }
    }

    # Put the contents
    file_put_contents($file, implode(PHP_EOL, $fileContents);

}
于 2012-09-30T05:28:35.540 に答える
1

試す

$url = glob($savePath.'*.txt');
foreach ($url as $file => $files) {
  $lines = file($files);
  foreach ($lines as $key=>$line) {
    if (!preg_match('/(word|word2|word3)/i', $line) && substr($line, -1) != '.') {
      unset($lines[$key]);
    }
  }
  $ori_content = implode("\n", $lines);
}
于 2012-09-30T05:47:29.207 に答える
0

セカンダリ バッファーを作成する必要があります。

$url = glob($savePath.'*.txt');
foreach ($url as $file => $files) {
    $handle = fopen($files, "r") or die ('can not open file');
    $ori_content= file_get_contents($files);
    /* Create our second buffer */
    $buffer2 = "";
    foreach(preg_split("/((\r?\n)|(\r\n?))/", $ori_content) as $buffer){
        $pos1 = stripos($buffer, $word1);
        $pos2 = stripos($buffer, $word2);
        $pos3 = stripos($buffer, $word3);
        $last = $str[strlen($buffer)-1];//read the last character
        /* This will only execute if the three words and a trailing period are _not_ found */
        if ($pos1 === false && $pos2 === false && $pos3 === false && $last != '.') {
            $buffer2 .= $buffer . PHP_EOL;
        }
    }
}
echo $buffer2;
于 2012-09-30T05:25:43.620 に答える
0

私はちょうど爆発を使用します:

$handle = fopen($files, "r") or die ('can not open file');
$ori_content = file_get_contents($files);

$lines = explode ( '\n' , $ori_content );

foreach ( $lines AS $line )
{
 if (strpos ( $line , 'word' ) !== false OR strpos ( $line , 'word2' ) !== false OR strpos ( $line , 'word3' ) !== false OR substr ( $line , -1 ) == '.')
  {
   $newParagraph = $line . '\n';
  }
}

echo $newParagraph;

あなたがしようとしていたものよりもはるかに簡単です。

于 2012-09-30T05:30:34.740 に答える