Windows 读取日志文件中的多行并在CSV文件中设置为1行

Windows 读取日志文件中的多行并在CSV文件中设置为1行,windows,svn,batch-file,logging,batch-processing,Windows,Svn,Batch File,Logging,Batch Processing,在SVN日志文件中,每个版本都有多行。有时每个ID只有一个版本,有时可能会有更多版本(我已经看到30个)。 每个修订由delimter设置“-----------------------------------” 我们希望将输出重新排序为CSV,每个版本有一行。 请参阅附加的输入日志和输出日志链接 以下是指向输出和输入的链接: output.csv有5行。每个版本或ID对应一行 有没有一种方法可以通过FOR循环来实现 [ FOR /F "delims=~" %%a in (svn.log) e

在SVN日志文件中,每个版本都有多行。有时每个ID只有一个版本,有时可能会有更多版本(我已经看到30个)。 每个修订由delimter设置“-----------------------------------” 我们希望将输出重新排序为CSV,每个版本有一行。 请参阅附加的输入日志和输出日志链接 以下是指向输出和输入的链接: output.csv有5行。每个版本或ID对应一行

有没有一种方法可以通过FOR循环来实现

[ FOR /F "delims=~" %%a in (svn.log)  echo %%a  
  set col3 = %%a 
  echo col3 col2 col1 ]  

这也会处理分隔符行,它似乎可以满足您对示例文件的需求

这使用了一个名为
repl.bat
(由dbenham提供)的助手批处理文件-下载自:

repl.bat
放在与批处理文件相同的文件夹中,或放在路径上的文件夹中

@echo off
type "svn.log"|findstr /r /v /c:"^----------"|repl "," " "|repl "^ *([AMD] .*)\r\n" " $1" xm |repl "(^Changed paths:)\r\n" "$1" xm |repl "^[ /t]*$" "" xm |repl "\r\n\r\n" "\r\n" xm |repl "(.*)\r\n(.*)\r\n(.*)\r\n(.*)\r\n" "$4,$3,$1,$2\r\n" xm  > "output.csv"
也使用VBS的扩展版本:

@echo off
set "fileout=%temp%\svntemp.tmp"
type "svn.log"|findstr /r /v /c:"^----------"|repl "," ";"|repl "^ *([AMD] .*)\r\n" " $1" xm |repl "(^Changed paths:)\r\n" "$1" xm |repl "\r\n" "," xm |repl ",,," "," |repl ",," "," |repl ",," "," |repl "," "\r\n" x >"%fileout%" 

(
 echo Const ForReading = 1, ForWriting = 2
 echo infile = "%fileout%"
 echo Set fso = CreateObject("Scripting.FileSystemObject"^)
 echo Set f1 = fso.OpenTextFile(infile, ForReading^)
 echo Do While not f1.AtEndOfStream
 echo f = f1.readline 
 echo Wscript.echo f  
 echo    if lcase(left(f,14^)^) = "changed paths:" then flag = 1 : line = "" else flag = 0 
 echo       do while flag = 1
 echo          f = f1.readline
 echo             if not lcase(left(f,9^)^) = "ques id: " then line=line + f + "; " else Wscript.echo line : Wscript.echo f : exit do 
 echo       loop
 echo loop
 echo f1.close
)>"%fileout%.vbs"

cscript /nologo "%fileout%.vbs" >"%fileout%.2"

type "%fileout%.2"|repl "(.*)\r\n(.*)\r\n(.*)\r\n(.*)\r\n" "$4,$3,$1,$2\r\n" xm  > "output.csv"
del "%fileout%" "%fileout%.2" "%fileout%.vbs"

如果您可以提供一个输出文件,该文件正是您在整个输入文件中所需要的,那么可能有人知道需要如何处理额外的行。我以CSV格式更新了输出文件的格式。所有Delimeter行”-----“删除。这些是唯一的多余的线绳。这对于原始输入效果很好。问题是,SVN中的版本输入在版本之间不断变化。我只是需要不同的身份证和不同的表现。我可能需要找出行的SVN格式。SVN修订版、操作、描述、问题ID中的列。我可以附加输出,但我需要找出SVN输出数据的不同方式。您能帮助我了解代码在做什么吗?说明/操作中的空格和附加行以及逗号似乎可以摆脱脚本。我让代码将所有逗号更改为一个空格-因此额外的逗号不会影响Excel。我降低了对前导空格和空行空格的敏感度,它对逗号不敏感,但Excel对额外的逗号敏感。这个解决方案使用正则表达式——在我解释之前,你需要知道它们是如何工作的。本质上,findstr删除以------和空行开头的行,以及带空格的空行,然后repl将“以空格和M开头”的行连接起来,这样总共只有4行,最后它将这些行之间用逗号重新排序为csv格式。如果可以,请提供更多输入示例。我添加了输入和输出文件链接。我使用了你对脚本的新更改。SVN似乎使用M、A和D作为修改添加和删除的占位符。您可以针对输入运行创建的脚本,并查看描述中带有逗号的记录是如何受到影响的。请参阅下面链接中的文件