Batch file 将每行两个csv文件与输出(如果添加、删除或更新)进行比较

Batch file 将每行两个csv文件与输出(如果添加、删除或更新)进行比较,batch-file,Batch File,我有两个csv文件,其中有5个字段,分隔符是逗号。我需要比较这些文件,并获得一个输出文件,其中包含添加、更新或删除哪些行的信息 我发现了几个批处理脚本,它们使用fc或comp函数进行比较,但只给出了文件之间的差异。我没有发现相关主题可以给出关于添加、更新或删除行的结果 有人能帮我吗?这个话题很有趣!也许您和我一样,发现FC命令的输出格式令人困惑和恼火,尽管它确实提供了所需的信息。下面的批处理程序获取FC命令的输出,并以允许识别是否在原始文件的两行之间添加了新的信息块、是否从原始文件中删除了一行或

我有两个csv文件,其中有5个字段,分隔符是逗号。我需要比较这些文件,并获得一个输出文件,其中包含添加、更新或删除哪些行的信息

我发现了几个批处理脚本,它们使用fc或comp函数进行比较,但只给出了文件之间的差异。我没有发现相关主题可以给出关于添加、更新或删除行的结果


有人能帮我吗?

这个话题很有趣!也许您和我一样,发现FC命令的输出格式令人困惑和恼火,尽管它确实提供了所需的信息。下面的批处理程序获取FC命令的输出,并以允许识别是否在原始文件的两行之间添加了新的信息块、是否从原始文件中删除了一行或任何其他文件修改(更新)情况的方式对其进行重新排列。最困难的部分是选择以一种令人愉快的方式显示信息的格式,但我认为我的解决方案相当不错

@echo off
rem FCOMP.BAT: Format FC output in a pleasant way
rem Antonio Perez Ayala
if "%~2" neq "" goto start
echo Format FC output identifying added, deleted or updated sections
echo/
echo FCOMP filename1 filename2 [/switches /for /FC /command]
goto :EOF

:start
setlocal EnableDelayedExpansion
set while=if not
set do=goto endwhile
set endwhile=goto while
set "space= "
set "spaces39=                                       "
fc %3 %4 %5 %6 %7 %8 %9 %1 %2 > differences.txt
if %errorlevel% equ 1 call :FormatFC < differences.txt
del differences.txt
goto :EOF

:FormatFC
set /P line=
set /P line=
rem Process each set of differences
:while
%while% defined line %do%
   rem Load old and new sections of this set
   set line=
   set /P line=
   set old=0
   :while1
   %while% "!line:~0,5!" neq "*****" %do%1
      set /A old+=1
      set oldLine[%old%]=!line!%spaces39%
      set line=
      set /P line=
   %endwhile%1
   :endwhile1
   set line=
   set /P line=
   set new=0
   :while2
   %while% "!line:~0,5!" neq "*****" %do%2
      set /A new+=1
      set newLine[%new%]=!line!%space%
      set line=
      set /P line=
   %endwhile%2
   :endwhile2
   rem Identify the type of this set
   if %old% equ 2 (
      echo ======  NEW SECTION ADDED  ====================================================
      echo/
      echo(!oldLine[1]:~0,79!
      set /A new-=1
      for /L %%i in (2,1,!new!) do echo(        ^|!newLine[%%i]:~0,70!
      echo(!oldLine[2]:~0,79!
   ) else if %new% equ 2 (
      echo OLD SECTION DELETED  ==========================================================
      echo/
      echo(---------!newLine[1]:~0,70!
      set /A old-=1
      for /L %%i in (2,1,!old!) do echo -!oldLine[%%i]:~0,78!
      echo(---------!newLine[2]:~0,70!
   ) else ( rem both %old% and %new% gtr 2
      echo ==============================  SECTION UPDATED  ==============================
      echo/
      if %old% lss %new% (
         for /L %%i in (1,1,%old%) do echo(!oldLine[%%i]:~0,39!^|!newLine[%%i]:~0,39!
         set /A old+=1
         for /L %%i in (!old!,1,%new%) do echo(%spaces39%^|!newLine[%%i]:~0,39!
      ) else (
         for /L %%i in (1,1,%new%) do echo(!oldLine[%%i]:~0,39!^|!newLine[%%i]:~0,39!
         set /A new+=1
         for /L %%i in (!new!,1,%old%) do echo(!oldLine[%%i]:~0,39!
      )
   )
   rem Pass to next set of differences
   echo/
   set /P line=
   set line=
   set /P line=
%endwhile%
:endwhile
exit /B
@echo关闭
rem FCOMP.BAT:以令人愉快的方式格式化FC输出
雷姆·安东尼奥·佩雷斯·阿亚拉
如果“%~2”neq“转到开始
识别添加、删除或更新节的回声格式FC输出
回音/
echo FCOMP filename1 filename2[/switches/for/FC/command]
后藤:EOF
:开始
setlocal EnableDelayedExpansion
设置while=如果不是
设置do=goto endwhile
设置endwhile=goto while
设置“空间=”
设置“spaces39=”
fc%3%4%5%6%7%8%9%1%2>differences.txt
如果%errorlevel%equ 1调用:FormatFC
Antonio

编辑:正如所指出的,这是一个shell脚本选项,希望它能对其他人有所帮助

这里有一个选项,我还没有检查它在超大文件中的性能:

$ cat file1
1,'adam'
2,'chris'
6,'phil'
3,'charles'

$ cat file2
2,'christopher'
6,'phil'
3,'chuck'
8,'sue',2
4,'mary'
21,'matt'
--我们假设CSV文件删除器是逗号,每条记录的第一个字段是主键(唯一值)

--删除


$cat data2.txt | grep-v-E-f-您没有提供足够的信息来解决您的问题。您如何区分更新和删除/插入?行的顺序重要吗?或者每行都有主键吗?您希望结果是什么样的?一旦您建立了规则,您就可以实现这些规则包含一个批处理文件,但它可能不是我的第一选择。+1-很好的Aacini。你能稍微记录一下这些选项吗。我假设/switches是FC的选项,但我对其他选项(/for,/FC,/COMMAND)一无所知。我喜欢输出格式,但如果更新发生在一条长线的末尾,则很难理解。除了允许显示长度超过80个字符之外,我没有任何建议。哇,这是解决我问题的一个很好的答案。非常感谢much@dbenham:谢谢,戴夫!选项应该是:
[FC开关]
。我正在努力解决长线问题…@user1809753:您可以从中获得我的程序的最新版本。它可以实现更精确的分区标识和管理长线等功能。。。
$ comm -3 <(sort file1) <(sort file2) | sed -e 's/^[ \t]*//' | awk -F , '{if (a[$1]) {print "^"$1","} {a[$1] = $0}}' > data2.txt
$ cat data2.txt | grep -E -f - file2
$ cat data2.txt | grep -v -E -f - <(comm -2 -3 <(sort file1) <(sort file2))
$ cat data2.txt | grep -v -E -f - <(comm -1 -3 <(sort file1) <(sort file2))