1

このようなファイルがあります

apple

ae-pal

noun.

a fruit

ball

b'al

noun.

playing material
round shaped

等々。そのため、単語で始まり、次に空白行と発音が続きます(上記のものはばかげていると思います:P)。次に、品詞と意味。各用語の後に空白行があります。私が最終的に望むのは、再帰呼び出しを実行して、最初の単語を選択し、データベース (mysql の場合もあります) の 1 つのテーブルに配置し、次に同じテーブルの対応する行に 2 番目に配置することです。

まず、このスペースに番号を付けたいと思いました。1 2 3 4 など。1、5、9、つまり 2*x+1 をある場所に置き、2*x を別の場所に置くことができるようにします。この方法でポイントに到達し、それらをデータベースにプッシュして、最終的に私の辞書を取得できます。

空行を数値に置き換える方法は見つかりましたが、数値を増やす方法を見つけることができませんでした。sed、awk、さらには python を使用してこれをどのように実装できるのだろうか。間違いなく正規表現がそこにあるでしょう。

疑似コード

is line empty ? 
   yes ? give a number  x (x =1)
   increase x by 1
   no ? go to next line
   repeat till eof.

私は十分に明確であることを願っています!

4

4 に答える 4

2

これはあなたのために働くかもしれません:

awk '/^$/{print ++c;next};1' file

またはGNUSed:

touch /tmp/c
addone () { c=$(</tmp/c); ((c+=1)); echo $c | tee /tmp/c; }
export -f addone
sed '/^$/s//addone/e' file
rm /tmp/c

別の方法として、すべての空白行をタブに変換し、4つおきのタブを改行に変換することもできます。

sed ':a;$!{N;ba};s/\n\n/\t/g;y/\n/ /;' file | sed 's/\t/\n/4;P;D'
于 2012-08-15T06:02:07.823 に答える
1

空白行を数えるループを実行してから、データベースに挿入することが重要です。

さあ、phpでの迅速で汚い実装です

<?php

$filename = $argv[1];

if(file_exists($filename) && is_readable($filename)) {

    $fh = fopen ($filename, "r");
    $count = 0;
    $el = 0;
    $items = array();
    while(!feof($fh)) {
        $line = fgets($fh);
        if($line == "\n")
        {
            $count++;
            if($count == 4)
            {
                $el ++;
                $count = 0;
            }
            continue;
        }
        $items[$el][$count] .= $line;
    }
    fclose($fh);
}
var_dump($items);

?>

コマンドラインでphpscript.phpfilenameとして実行しますこれは私が得たものです

array(4) {
  [0] =>
  array(4) {
    [0] =>
    string(6) "apple\n"
    [1] =>
    string(7) "ae-pal\n"
    [2] =>
    string(6) "noun.\n"
    [3] =>
    string(8) "a fruit\n"
  }
  [1] =>
  array(4) {
    [0] =>
    string(5) "ball\n"
    [1] =>
    string(5) "b'al\n"
    [2] =>
    string(6) "noun.\n"
    [3] =>
    string(30) "playing material\nround shaped\n"
  }
  [2] =>
  array(4) {
    [0] =>
    string(5) "pink\n"
    [1] =>
    string(7) "pe-ank\n"
    [2] =>
    string(6) "color\n"
    [3] =>
    string(14) "girlish\ncolor\n"
  }
  [3] =>
  array(1) {
    [0] =>
    string(0) ""
  }
}
于 2012-08-15T06:00:06.903 に答える
1
(line for line in open(...) if line)

ファイルの空でない行に対する iterable です。このレシピを使用して、4 回反復処理します。

def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return izip_longest(*args, fillvalue=fillvalue)

nonempty_lines = (line for line in open(...) if line)
grouper(nonempty_lines, 4)
于 2012-08-15T05:32:37.043 に答える
1

が呼び出されiterableたときにのみ生成されるため、 を使用できますnext()

with open('data.txt') as f:
    lines=[x.strip() for x in f]
    spaces=lines.count('')   #count the number of empty lines
    odd_spaces=spaces//2+1   #odd lines 1,3,5,7...
    even_spaces=spaces-odd_spaces #even lines 2,4,6,...

    it=iter(range(1,spaces+1)) #create an iterable
    try:
        lines=[x if x!='' else next(it) for x in lines]  #if line is empty then call next(it)
    except StopIteration:
        pass
    for x in lines:
        print(x)

    fil=[4*x+1 for x in range(0,spaces+1) if 4*x+1<spaces] #4x+1
    print(fil)
    row=[lines[lines.index(x)-1] for x in fil]
    print(row)

    fil=[2*x+1 for x in range(0,spaces+1) if 2*x+1<spaces] #2x+1
    print(fil)
    row=[lines[lines.index(x)-1] for x in fil]
    print(row)

出力:

apple
1
ae-pal
2
noun.
3
a fruit
4
ball
5
b'al
6
noun.
7
playing material
round shaped
[1, 5]
['apple', 'ball']
[1, 3, 5]
['apple', 'noun.', 'ball']
于 2012-08-15T05:44:33.133 に答える