将文本文件分成多个小文件

时间:2017-09-16 13:58:52

标签: xml perl

我必须将一个文本文件 - 大约600MB - 分成许多较小的文件,每个文件都有一个唯一的名称。

在主文件中,我有一个标签(比如version: '3' services: db: image: postgres:9.6-alpine volumes: - data:/var/lib/postgresql/data ports: - 5432:5432 web: image: python:3.6-alpine command: ./waitforit.sh solr:8983 db:5432 -- bash -c "./init.sh" build: . env_file: ./.env volumes: - .:/sark - solrcores:/solr ports: - 8000:8000 links: - db - solr restart: always solr: image: solr:6-alpine ports: - 8983:8983 entrypoint: - docker-entrypoint.sh - solr-precreate - sark volumes: - solrcores:/opt/solr/server/solr/mycores volumes: data: solrcores: ),它在整个文件中重复出现。我必须制作其中六个标签并将它们放在较小的文本文件中。

代码:我无法生成多个测试文件,因为我的代码不正确。

FROM python:3

# Some stuff that everyone has been copy-pasting
# since the dawn of time.
ENV PYTHONUNBUFFERED 1

# Install some necessary things.
RUN apt-get update
RUN apt-get install -y swig libssl-dev dpkg-dev netcat

# Copy all our files into the image.
RUN mkdir /sark
WORKDIR /sark
COPY . /sark/

# Install our requirements.
RUN pip install -U pip
RUN pip install -Ur requirements.txt

1 个答案:

答案 0 :(得分:-1)

您的代码中有许多完全不正确的内容。

所以我在这里写的是:

#!/usr/bin/perl

# Split a large file into files named by the latest <Name>...</Name> tag read.

use strict;

my $infile = $ARGV[0];
my $outprefix = $ARGV[1];

die("USAGE: $0 inputfile.xml out-prefix-") unless $outprefix;

my $name = "noname"; # current name to add to $outprefix
my $infh; # input file handle
my $outfh; # output file handle
my $line; # line being read

die("Cannot open input file \"$infile\" : $!")
    unless open($infh, "<$infile");

while( defined($line=<$infh>) ){

    if( $line =~ m!^<Name>([^<>]+)</Name>!i ){
        $name = lc($1);
        $name =~ s/[^\w.]+/-/g;
        $name =~ s/^-//;
        $name =~ s/-$//;
        $name = "noname" unless $name;

        # Close output of previous name :
        if( $outfh ){
            close($outfh);
            undef $outfh;
        }
    }

    unless( $outfh ){
        die("Cannot open output file \"$outprefix$name\" : $!")
            unless open($outfh, ">>$outprefix$name");
        print("Now writing to $outprefix$name ...\n");
    }

    print($outfh $line);

}

close($outfh) if $outfh;
close($infh);

print("DONE.\n");

不要忘记我们在第一个标记之前不知道文件名,所以如果你想要包含之前的内容(换句话说,之前拆分),你将不得不缓冲这些行在写一个变量之前。