1

ファイルの各行が 1 日のデータを表している場合、テキスト ファイルに保存された毎日の株価のファイルがあります。例えば:

20/05/2013  23.46   23.58   23.43   23.57   32884800    23.57
17/05/2013  23.27   23.48   23.2    23.46   41037700    23.46

保存されたファイルの最後の日付 (最後の日付はファイルの上部に表示されます) をチェックし、それを現在の日付と比較し、等しくない場合は、欠落している行のみを追加して欠落しているデータを更新するアップデーターを作成しました (新しい行は既存のファイルの上に追加されます)。

このアプローチを使用して行を追加しました。

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

print $out "# Add this line to the top\n";

while( <$in> )
    {
    print $out $_;
    }

close $out;

そして、一般的に、1 つの問題だけで問題なく動作します。最も古い行と最初に追加された最初の行の間に、空の行が 1 行追加されています。たとえば、最後に保存した日付が

15/05/2013  23.04   23.25   22.91   23.24   40153000    23.24

そして、新しい行が追加されています:

16/05/2013  23.1    23.35   23.1    23.27   33023300    23.27

次のようになります。

15/05/2013  23.04   23.25   22.91   23.24   40153000    23.24

16/05/2013  23.1    23.35   23.1    23.27   33023300    23.27

私はそれがそのように見えるようにしたい:

15/05/2013  23.04   23.25   22.91   23.24   40153000    23.24
16/05/2013  23.1    23.35   23.1    23.27   33023300    23.27

\n行を追加するときに を取り除くことを考えましたが、長い文字列が 1 つだけ生成されます。どうにかして削除する必要があると思い\nますが、最後の行だけです。それ、どうやったら出来るの?

編集: 行末はただLFのように見えますが、そうではありませんCRLF。それは問題ですか?/^\s*$/現在、行が this または this:または this:のような空の行パターンと一致していないように見えるためです/^$/

4

1 に答える 1

1

chomp(未翻訳の CRLF の場合) 改行を賢く食べてから、実際に改行を出力するために使用できます。その間に、行が空の場合はスキップできます。

while( <$in> )
{
    chomp; chomp;        # Eat up to two newlines, just in case
    next if /^\s*$/;     # Line is empty or contains whitespace
    print $out "$_\n";
}
于 2013-05-21T02:09:11.923 に答える