Пакетный скрипт для объединения нескольких строк - PullRequest
0 голосов
/ 10 января 2019

У меня есть текстовый файл, который содержит несколько строк:

Mario Rossi 1:17.36 +0.00   1.33    (2) 1.34    (6) 11.46   (2) 1.43    (1) 1.32    (1) 7.55    (1) 3.40    (1) 8.44    (1) 1.21    (19)    12.40   (24)
SWE         1.33    (2) 3.07    (2) 14.53   (2) 16.36   (1) 18.08   (1) 26.03   (1) 29.43   (1) 38.27   (1) 39.48   (1) 52.28   (1)
Alex Haas 1:18.11   +0.35   1.28    (1) 1.35    (10)    11.35   (1) 2.04    (34)    1.42    (6) 8.47    (7) 3.57    (4) 9.26    (2) 1.18    (5) 11.23   (2)
NOR         1.28    (1) 3.03    (1) 14.38   (1) 16.42   (2) 18.24   (2) 27.11   (2) 31.08   (2) 40.34   (2) 41.52   (2) 53.15   (2)

Я хочу объединить 2 строки одновременно, чтобы результат выглядел следующим образом:

Mario Rossi 1:17.36 +0.00   1.33    (2) 1.34    (6) 11.46   (2) 1.43    (1)
SWE                         1.33    (2) 3.07    (2) 14.53   (2) 16.36   (1)
1.32    (1) 7.55    (1) 3.40    (1) 8.44    (1) 1.21    (19)    12.40   (24)
18.08   (1) 26.03   (1) 29.43   (1) 38.27   (1) 39.48   (1)     52.28   (1)

Alex Haas 1:18.11   +0.35   1.28    (1) 1.35    (10)    11.35   (1) 2.04    (34)
NOR                         1.28    (1) 3.03    (1)     14.38   (1) 16.42   (2)
1.42    (6) 8.47    (7) 3.57    (4) 9.26    (2) 1.18    (5) 11.23   (2)
18.24   (2) 27.11   (2) 31.08   (2) 40.34   (2) 41.52   (2) 53.15   (2)

Все пары линий имеют одинаковый формат. В строках может быть гораздо больше элементов, поэтому мне нужно объединить их по нескольким строкам (например, вывести первые 12 элементов первой строки, затем первые 12 элементов второй строки, затем следующие 12 элементов первой строки, затем следующие 12 элементы второй строки и т. д. до конца строки).

До сих пор я мог только найти решения, в которых несколько строк объединяются, когда нет необходимости смешивать содержимое строк ( Как объединить несколько строк в одном текстовом файле в одну строку в Windows? или Batch - Объедините две строки и добавьте запятую для переформатирования txt в csv ). Поэтому я застрял со следующим фрагментом кода, который я не знаю, как завершить:

@echo off
set _inputfile=myfile
setlocal enabledelayedexpansion
set evenflag=1
for /f "tokens=*" %%x in (%_inputfile%.txt) do set x1=!x2! && set x2=%%x && (
set /a evenflag^^=1 && if !evenflag!==1 (
    rem how to process !x1! and !x2! to get desired output?
))
pause

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Как предложил Герхард Барнард , пакетный скрипт для этой цели будет очень сложным. Я легко решил свою проблему с помощью следующего скрипта Perl:

#!/usr/bin/perl
my $elementtoprint = 12; #how many elements per line are printed in the output
local $" = "\t"; #set tab as default separator when printing an array

open my $info, "input.txt" or die "Could not open $file: $!";

while ( my $line1 = <$info> )
{
    defined(my $line2 = <$info>) or last;
    #convert strings into arrays
    my @tab1 = split(/\s+/, $line1);
    my @tab2 = split(/\s+/, $line2);

    #handle first output lines (with people's names) differently
    my @subtab1 = splice (@tab1,0,$elementtoprint);
    my @subtab2 = shift(@tab2);
    my @subtab3 = splice (@tab2,0,$elementtoprint-4);
    print "@subtab1 \n";
    print "@subtab2 \t\t\t\t@subtab3 \n";

    while(@tab1&&@tab2)
    {
        my @subtab1 = splice(@tab1,0,$elementtoprint);
        my @subtab2 = splice(@tab2,0,$elementtoprint);
        print "@subtab1 \n";
        print "@subtab2 \n";
    }
    print "\n";
}

close $info;
0 голосов
/ 11 января 2019

Этот код делает то, что вы хотите:

@echo off
setlocal EnableDelayedExpansion

set "spaces28=                            "
set "line1="
for /F "delims=" %%a in (input.txt) do (
   if not defined line1 (
      set "line1=%%a"
   ) else (
      set "line2=%%a"
      call :SplitLines
   )
)
goto :EOF


:SplitLines

set "header=1"
:nextPart

   for /F "tokens=12*" %%a in ("%line1%") do (
      if "%%b" equ "" (set "head=%line1%") else set "head=!line1:%%b=!"
      set "line1=%%b"
   )
   set /P "=%head%" < nul
   echo/

   if %header% equ 1 (
      for /F "tokens=9*" %%a in ("%line2%") do (
         if "%%b" equ "" (set "head=%line2%") else set "head=!line2:%%b=!"
         for /F "tokens=1*" %%c in ("!head!") do (
            set "head=%%c%spaces28%"
            set "head=!head:~0,28!%%d"
         )
         set "line2=%%b"
      )
      set "header=0"
   ) else (
      for /F "tokens=12*" %%a in ("%line2%") do (
         if "%%b" equ "" (set "head=%line2%") else set "head=!line2:%%b=!"
         set "line2=%%b"
      )
   )
   set /P "=%head%" < nul
   echo/

if defined line1 goto nextPart
echo/

exit /B

Пример вывода:

Mario Rossi 1:17.36 +0.00   1.33    (2) 1.34    (6) 11.46   (2) 1.43    (1) 
SWE                         1.33    (2) 3.07    (2) 14.53   (2) 16.36   (1) 
1.32    (1) 7.55    (1) 3.40    (1) 8.44    (1) 1.21    (19)    12.40   (24)
18.08   (1) 26.03   (1) 29.43   (1) 38.27   (1) 39.48   (1) 52.28   (1)

Alex Haas 1:18.11   +0.35   1.28    (1) 1.35    (10)    11.35   (1) 2.04    (34)    
NOR                         1.28    (1) 3.03    (1) 14.38   (1) 16.42   (2) 
1.42    (6) 8.47    (7) 3.57    (4) 9.26    (2) 1.18    (5) 11.23   (2)
18.24   (2) 27.11   (2) 31.08   (2) 40.34   (2) 41.52   (2) 53.15   (2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...