! / bin / bash Прочитать файл и разбить его на & lt; xml [duplicate]

Другим решением было бы поставить вызов: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this) в конструктор MileageFeeCalculator следующим образом:

@Service
public class MileageFeeCalculator {

    @Autowired
    private MileageRateService rateService; // <--- will be autowired when constructor is called

    public MileageFeeCalculator() {
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)
    }

    public float mileageCharge(final int miles) {
        return (miles * rateService.ratePerMile()); 
    }
}
11
задан CanSpice 10 February 2011 в 01:37
поделиться

5 ответов

awk '/[0-9]+ of [0-9]+ DOCUMENTS/{g++} { print $0 > g".txt"}' file

Пользователям OSX потребуется gawk, так как встроенный awk приведет к ошибке, например awk: illegal statement at source line 1

Ruby (1.9 +)

#!/usr/bin/env ruby
g=1
f=File.open(g.to_s + ".txt","w")
open("file").each do |line|
  if line[/\d+ of \d+ DOCUMENTS/]
    f.close
    g+=1
    f=File.open(g.to_s + ".txt","w")
  end
  f.print line
end
22
ответ дан Ian 22 August 2018 в 21:47
поделиться
  • 1
    OH, и у нас есть победитель .... И элегантность. Я провел очень влажное лето в 1997 году с книгой O'Reilly sed / awk. Хотел бы я все это вспомнить сейчас. I будет идти и получить его tmrw. СПАСИБО – rosser 10 February 2011 в 02:32
  • 2
    Это решение помещает совпадающую строку в новый файл, который отвечает на вопрос. Но если, как и я, вы хотите поместить совпадающую строку в старый файл перед тем, как начать новую, вы сделали бы это: awk '{print $0 > n".txt"} /text to match/ {n++} – indiv 14 March 2014 в 03:03
  • 3
    Примечание: в Mac OS X вам нужно gawk, например, MacPorts для этого – Thomas Wana 28 April 2016 в 15:42

regex в соответствии с «X of XXX DOCUMENTS» - это \ d {1,3} из \ d {1,3). ДОКУМЕНТЫ

чтение строки за строкой и начало записи нового файла при регулярном совпадении должно быть в порядке.

0
ответ дан bw_üezi 22 August 2018 в 21:47
поделиться

Непроверенный:

base=outputfile
start=1
pattern='^[[:blank:]]*[[:digit:]]+ OF [[:digit:]]+ DOCUMENTS[[:blank:]]*$

while read -r line
do
    if [[ $line =~ $pattern ]]
    then
        ((start++))
        printf -v filecount '%4d' $start
        >"$base$filecount"    # create an empty file named like foo0001
    fi
    echo "$line" >> "$base$filecount"
done
-1
ответ дан Dennis Williamson 22 August 2018 в 21:47
поделиться
  • 1
    Кстати, вышесказанное - это чистый Баш. Кроме того, я уверен, что Python или Perl будут намного быстрее. – Dennis Williamson 10 February 2011 в 01:47
  • 2
    Можете ли вы сделать это с помощью csplit? csplit -k -z --digits = 3 --suffix = '% d.TXT' --prefix = FILE * .TXT / 'SPLITONTHIS' – rosser 10 February 2011 в 01:48
  • 3
    @rosser - это кандидат на раскол, не знаю csplit, хотя – sln 10 February 2011 в 02:09
  • 4
    @sln: split делает файлы с фиксированным размером, а не регулярными выражениями. @rosser: csplit - определенная возможность. – Dennis Williamson 10 February 2011 в 02:21

Насколько вы старались в Perl?

Изменить Вот более быстрый метод. Он разбивает файл и печатает файлы деталей.

use strict;
use warnings;

my $count = 1;

open (my $file, '<', 'source.txt') or die "Can't open source.txt: $!";

for (split /(?=^.*\d+[^\S\n]*of[^\S\n]*\d+[^\S\n]*DOCUMENTS)/m, join('',<$file>))
{
    if ( s/^.*(\d+)\s*of\s*\d+\s*DOCUMENTS.*(\n|$)//m )
    {
        open (my $part, '>', "Part$1_$count.txt") 
            or die "Can't open Part$1_$count for output: $!";
        print $part $_;
        close ($part);
        $count++;
    }
}
close ($file);

Это метод по строкам:

use strict;
use warnings;

open (my $masterfile, '<', 'yourfilename.txt') or die "Can't open yourfilename.txt: $!";

my $count = 1;
my $fh;

while (<$masterfile>) {
    if ( /(?<!\d)(\d+)\s*of\s*\d+\s*DOCUMENTS/ ) {
        defined $fh and close ($fh);
        open ($fh, '>', "Part$1_$count.txt") or die "Can't open Part$1_$count for  output: $!";
        $count++;
        next;
    }
    defined $fh and print $fh $_;
}
defined $fh and close ($fh);
close ($masterfile);
1
ответ дан sln 22 August 2018 в 21:47
поделиться
  • 1
    $count не определено. Я подозреваю, что вы имели в виду $cnt. Кроме того, при первом запуске цикла $fh значение не определено, поэтому при попытке закрыть $fh вы получите сообщение об ошибке / предупреждение Can't use an undefined value as a symbol reference. – CanSpice 10 February 2011 в 01:42
  • 2
    @CanSpice, теперь это нормально? – sln 10 February 2011 в 01:50
  • 3
    Выглядит лучше! – CanSpice 10 February 2011 в 01:51
  • 4
    Путь над моей головой в Perl - не то, что я не пытаюсь ... Perl, Python, R, бит Ruby, bash, немного C ++. А также быть документом Doc и пытаться сделать некоторые исследования ... ta для помощи. – rosser 10 February 2011 в 01:59
  • 5
    Можно также поставить чек на окончательный close () тоже – sln 10 February 2011 в 02:00

Как было предложено в других решениях, вы можете использовать csplit для этого:

csplit csplit.test '/^\.\.\./' '{*}' && sed -i '/^\.\.\./d' xx*

Я не нашел лучшего способа избавиться от напоминающего разделителя в разделенных файлах.

9
ответ дан ℝaphink 22 August 2018 в 21:47
поделиться
  • 1
    Я не могу попробовать прямо сейчас, потому что на окнах, но man-страница csplit, похоже, предлагает использовать% REGEX% вместо / REGEX / для этого: / REGEXP / [OFFSET] копировать до, но не включать соответствующую строку% REGEXP% [OFFSET ] пропустить, но не включая соответствующую строку – Spikolynn 7 July 2015 в 17:51
Другие вопросы по тегам:

Похожие вопросы: