合并上周创建的多个csv

时间:2016-02-11 16:50:29

标签: csv batch-file merge batch-processing

raccoozie提供的此脚本的工作原理如下:

internal void Initialize(OptionsModel model)
{
    this.model = model;
    model.PropertyChanged += ModelPropertyChanged;

    // Initialize properties with data from the model
}

private void ModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName == nameof(OptionsModel.FontSize))
    {
        // Update properties with data from the model
    }
}

现在我想添加一个条件,只选择过去7天创建的文件。

问题是该程序不会每天创建1个文件,但可能会在特定日期创建7,5,9或0个文件。

如何开始?

2 个答案:

答案 0 :(得分:1)

合并 7 上次创建的 .csv

@echo off
setlocal enabledelayedexpansion
set /a $c=1
set "fileName=combinedFiles.csv"

>"%filename%" (for /f "delims=" %%F in ('dir/b/a-d/od *.csv') do (
  if not "%%F"=="%fileName%" if !$c! LEQ 7 (
  type "%%F"
  set /a $c+=1)
  ))

编辑:合并过去7天内创建的所有 .csv 文件并按日期排序

@Echo off
::Get current Date -7 days with VBS
echo wscript.echo DateAdd("d", -7, date(^)^) >GetDate.vbs
for /f "delims=" %%a in ('cscript //nologo GetDate.vbs') do set "$Limit=%%a"
for /f "tokens=1-3 delims=/" %%a in ('echo %$Limit%') do set /a $Limit=%%c%%b%%a
Del GetDate.vbs 2>nul

setlocal enabledelayedexpansion

set "fileName=combinedFiles.csv"

(for /f "delims=" %%a in ('dir/b/a-d/o-d "*.csv"') do (
     for /f "tokens=1-3* delims=/ " %%b in ('dir /TC "%%a" ^| find "/"') do set "$DateTest=%%d%%c%%b"
     if not "%%F"=="%fileName%" if !$DateTest! GEQ %$Limit% type "%%a"
)
)>%fileName%"

日期转换为201/022011到20160211,具有逻辑测试值 (以后的日期总会更长)。因此,我们可以测试所有排序(dir /o-d)个文件,其值大于$Limit

现在我们按日期排序的文件不超过7天。

答案 1 :(得分:0)

SET "filename1=alreadydone.txt"
IF NOT EXIST "%filename1%" ECHO x:>>"%filename1%"
FOR /f "delims=" %%a IN (
 'dir /b /a-d /o:d "*.csv" ^|findstr /x /v /g:"%filename1%'
 ) DO (
 rem do your combine-file [%%a] here
 ECHO %%a>>"%filename1%"
)

此部分例程(生成%%a而不是%%F,因为这是我的模板所做的)获取目录列表并排除filename1中的文件。其余文件将传递到您已生成的代码的combine-file部分,文件名将记录在filename1中。

if not exist行在filename1中生成虚拟条目,以便findstr不会抱怨文件为空。

使用此方案,一旦处理完任何文件,其名称将保存在filename1中,并且不会被重新处理。只使用您的组合代码组合新文件。

结果:没有关于“7”或任何其他天数的锚。如果你分开运行7天,那7天的处理将被合并并记录下来。如果你因为预期公共假期而分开5天,那么将结合这5天。如果你去度假2周,那么由于没有人会按照你的指示去运行它,它将结合过去的14天。或者你可以每天运行它......

所以这是合并批次

@echo off
setlocal
set first=1
set fileName="combinedFiles.csv"
SET "filename1=alreadydone.txt"
IF NOT EXIST "%filename1%" ECHO x:>>"%filename1%"
>%fileName% (
for /f %%F in ('dir /b /a-d /o:d "*.csv" ^|findstr /x /v /g:"%filename1%"'
) do (
 ECHO %%F>>"%filename1%"
    if not "%%F"==%fileName% (
      if defined first (
        type "%%F"
        set "first="
      ) else more +1 "%%F"
    )
  )
)

[编辑:]删除sourcedir中的for/f,因为不需要目录规范(文件在当前目录中)

[进一步修改:]在/f中重新添​​加for并添加缺失的闭兔耳。