我有一个像这样的文件
apple
ae-pal
noun.
a fruit
ball
b'al
noun.
playing material
round shaped
等等。所以它从单词开始然后是一个空行和发音(我知道上面的那些是愚蠢的:P)。然后是词性和意义。每个学期后都有空行。 我最终想要的是做一个递归调用,这样它就可以将第一个单词放在数据库中的一个表中(mysql,可能是),然后放入同一个表的相应行中,依此类推。
首先,我想对这个空间进行编号。喜欢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.
我希望我足够清楚!
答案 0 :(得分:2)
这可能对您有用:
awk '/^$/{print ++c;next};1' file
或GNU sed:
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
另一种方法可能是将所有空行变为制表符,将每第四个制表符变为换行符。
sed ':a;$!{N;ba};s/\n\n/\t/g;y/\n/ /;' file | sed 's/\t/\n/4;P;D'
答案 1 :(得分:1)
(line for line in open(...) if line)
是对文件的非空行的可迭代。使用this recipe以四肢迭代:
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)
答案 2 :(得分: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']
答案 3 :(得分: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);
?>
在命令行中以php script.php文件名运行它 这就是我得到的
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) ""
}
}