Другим решением было бы поставить вызов: 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());
}
}
awk '/[0-9]+ of [0-9]+ DOCUMENTS/{g++} { print $0 > g".txt"}' file
Пользователям OSX потребуется
blockquote>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
regex в соответствии с «X of XXX DOCUMENTS» - это \ d {1,3} из \ d {1,3). ДОКУМЕНТЫ
чтение строки за строкой и начало записи нового файла при регулярном совпадении должно быть в порядке.
Непроверенный:
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
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);
$count
не определено. Я подозреваю, что вы имели в виду $cnt
. Кроме того, при первом запуске цикла $fh
значение не определено, поэтому при попытке закрыть $fh
вы получите сообщение об ошибке / предупреждение Can't use an undefined value as a symbol reference
.
– CanSpice
10 February 2011 в 01:42
Как было предложено в других решениях, вы можете использовать csplit
для этого:
csplit csplit.test '/^\.\.\./' '{*}' && sed -i '/^\.\.\./d' xx*
Я не нашел лучшего способа избавиться от напоминающего разделителя в разделенных файлах.
awk '{print $0 > n".txt"} /text to match/ {n++}
– indiv 14 March 2014 в 03:03gawk
, например, MacPorts для этого – Thomas Wana 28 April 2016 в 15:42