合并csv文件但删除最后一行和多列

合并csv文件但删除最后一行和多列,csv,batch-file,cmd,merge,Csv,Batch File,Cmd,Merge,我最初的问题是将多个csv合并为一个,删除每个csv的前几行(在我的案例5中)和所有空白行。我能够找到以下解决方案: @echo off >Output.csv( for %%f in (*.csv) do ( for /f "delims=" %%l in ('more +5 %%f') do ( echo %%f,%%l ) ) ) 我还无法重写代码来擦除每个文件的最后一行,以及从output.csv文件(或单个

我最初的问题是将多个csv合并为一个,删除每个csv的前几行(在我的案例5中)和所有空白行。我能够找到以下解决方案:

@echo off
>Output.csv(
    for %%f in (*.csv) do (
        for /f "delims=" %%l in ('more +5 %%f') do (
            echo %%f,%%l
        )
    )
)
我还无法重写代码来擦除每个文件的最后一行,以及从output.csv文件(或单个文件)中擦除几列

这是csv文件的一个示例:

Timecard Report
06/12/2017 - 06/12/2017
Departments : All_Departments-TOTAL HOURS

EMPLOYEE NAME,EMPLOYEE PAYROLL ID,FIRST NAME,LAST NAME,DEPARTMENT NAME,REG,REG Pay,OT1 Hours,OT1 Pay,OT2 Hours,OT2 Pay,VAC Hours,VAC Pay,HOL Hours,HOL Pay,SIC Hours,SIC Pay,OTH Hours,OTH Pay,TOTAL Hours,Total Pay 
Oc Br,999,Oc,Br,Fulfillment,8.00,114.8,.53,11.41,,,,,,,,,,,8.53,126.21 
Brat Hat,3423,Brat,Hat,Logistics Admin,5.42,75.88,,,,,,,,,,,,,5.42,75.88 
Tod Vindo,,Tod,Vindo,Logistics Admin,8.00,128,1.18,28.32,,,,,,,,,,,9.18,156.32 

TOTAL,,,,,73.53,1143.25,3.30,73.23,,,,,,,,,,,76.83,1216.48 

有人有想法吗?

IMO合并通常意味着添加列,而不是在末尾追加/连接。您可以使用
“skip=5 delims=“

要删除最后一行,可以将实际行存储在var中,然后打印上一行。由于这是在一个(代码块)内,所以您需要(可能会删除csv中的感叹号的内容)

要删除列,您需要指定一个分隔符和一个匹配的tokens参数,以省略不需要的列。
提供了“delims=,”并且您希望从6中剥离第2列和第5列

@echo off&SetLocal EnableDelayedExpansion
(   for %%f in (*.csv) do (
        Set "last="
        for /f "tokens=1,3-4,6 delims=," %%A in ('more +5 %%f') do (
            if defined last echo %%f,!last!
            Set "last=%%A,%%B,%%C,%%D"
        )
    )
) >Output.csv
我的示例输出:

Output.csv


FatTwin1.csv,1,3,4,6
FatTwin2.csv,13,15,16,18
要解决空字段的问题,您可以通过使用powershell(将所有字段双引号)im-/导出csv文件来规范化csv文件

此cmd行将调用powershell导入csv并导出当前文件夹中的所有csv文件,并在名称后面附加一个
\u dq
。这要求文件具有具有唯一列名的标题

Powershell -NonI -NoP -Com "gci *.csv -excl '*_dq.csv'|%{$fn=$_.Fullname;(import-csv $fn )|export-csv -path ($fn.replace('.csv','_dq.csv')) -notype}"

IMO合并通常意味着添加列,而不是在末尾追加/连接。您可以使用
“skip=5 delims=“

要删除最后一行,可以将实际行存储在var中,然后打印上一行。由于这是在一个(代码块)内,所以您需要(可能会删除csv中的感叹号的内容)

要删除列,您需要指定一个分隔符和一个匹配的tokens参数,以省略不需要的列。
提供了“delims=,”并且您希望从6中剥离第2列和第5列

@echo off&SetLocal EnableDelayedExpansion
(   for %%f in (*.csv) do (
        Set "last="
        for /f "tokens=1,3-4,6 delims=," %%A in ('more +5 %%f') do (
            if defined last echo %%f,!last!
            Set "last=%%A,%%B,%%C,%%D"
        )
    )
) >Output.csv
我的示例输出:

Output.csv


FatTwin1.csv,1,3,4,6
FatTwin2.csv,13,15,16,18
要解决空字段的问题,您可以通过使用powershell(将所有字段双引号)im-/导出csv文件来规范化csv文件

此cmd行将调用powershell导入csv并导出当前文件夹中的所有csv文件,并在名称后面附加一个
\u dq
。这要求文件具有具有唯一列名的标题

Powershell -NonI -NoP -Com "gci *.csv -excl '*_dq.csv'|%{$fn=$_.Fullname;(import-csv $fn )|export-csv -path ($fn.replace('.csv','_dq.csv')) -notype}"

新的powershell答案。此脚本:

$KeepCols = @(
"EMPLOYEE NAME",
"EMPLOYEE PAYROLL ID",
"FIRST NAME",
"LAST NAME",
"DEPARTMENT NAME",
"REG",
"REG Pay",
"OT1 Hours",
"OT1 Pay",
"TOTAL Hours",
"Total Pay ")

Get-ChildItem '*.csv' -Exclude '*_dq.csv'|
  ForEach-Object {
    $fn=$_.Fullname
    "Processing $fn"
    (Get-Content $fn) | Select-Object -Skip 4 | ConvertFrom-Csv|
    Where-Object "EMPLOYEE NAME" -ne "TOTAL"|
    Select-Object -Property $KeepCols|
      Export-Csv -path ($fn.replace('.csv','_dq.csv')) -NoType
  }
将根据您的上述样本生成此输出:

"EMPLOYEE NAME","EMPLOYEE PAYROLL ID","FIRST NAME","LAST NAME","DEPARTMENT NAME","REG","REG Pay","OT1 Hours","OT1 Pay","TOTAL Hours","Total Pay "
"Oc Br","999","Oc","Br","Fulfillment","8.00","114.8",".53","11.41","8.53","126.21 "
"Brat Hat","3423","Brat","Hat","Logistics Admin","5.42","75.88","","","5.42","75.88 "
"Tod Vindo","","Tod","Vindo","Logistics Admin","8.00","128","1.18","28.32","9.18","156.32 "
那么步骤呢

  • 处理所有
    .csv
    文件,排除带有尾随
    \u dq
    的文件,并保存为附加
    \u dq
  • 带4条线
  • 删除不需要的列
  • 正确引用字段
  • 删除最后一行
    TOTAL
完成了。仍然要做的是:

  • 合并文件(没有标题行,现在只有一行)
  • 检查最后一列是否确实有尾随空格

新的powershell答案。此脚本:

$KeepCols = @(
"EMPLOYEE NAME",
"EMPLOYEE PAYROLL ID",
"FIRST NAME",
"LAST NAME",
"DEPARTMENT NAME",
"REG",
"REG Pay",
"OT1 Hours",
"OT1 Pay",
"TOTAL Hours",
"Total Pay ")

Get-ChildItem '*.csv' -Exclude '*_dq.csv'|
  ForEach-Object {
    $fn=$_.Fullname
    "Processing $fn"
    (Get-Content $fn) | Select-Object -Skip 4 | ConvertFrom-Csv|
    Where-Object "EMPLOYEE NAME" -ne "TOTAL"|
    Select-Object -Property $KeepCols|
      Export-Csv -path ($fn.replace('.csv','_dq.csv')) -NoType
  }
将根据您的上述样本生成此输出:

"EMPLOYEE NAME","EMPLOYEE PAYROLL ID","FIRST NAME","LAST NAME","DEPARTMENT NAME","REG","REG Pay","OT1 Hours","OT1 Pay","TOTAL Hours","Total Pay "
"Oc Br","999","Oc","Br","Fulfillment","8.00","114.8",".53","11.41","8.53","126.21 "
"Brat Hat","3423","Brat","Hat","Logistics Admin","5.42","75.88","","","5.42","75.88 "
"Tod Vindo","","Tod","Vindo","Logistics Admin","8.00","128","1.18","28.32","9.18","156.32 "
那么步骤呢

  • 处理所有
    .csv
    文件,排除带有尾随
    \u dq
    的文件,并保存为附加
    \u dq
  • 带4条线
  • 删除不需要的列
  • 正确引用字段
  • 删除最后一行
    TOTAL
完成了。仍然要做的是:

  • 合并文件(没有标题行,现在只有一行)
  • 检查最后一列是否确实有尾随空格


感谢您的快速帮助。我通过将这两个代码粘贴到.bat文件中来尝试这两个代码,但两个代码似乎都不起作用。也没有Output.csv文件。有没有办法从我的角度解决这个问题?问题是重定向和我从代码中接管的开始括号之间缺少空格。改变了。啊,好的。代码现在运行和工作时只有一个例外:例如,“for/f”标记=1-2,5-9,12-13,17-19,21 delims=,“%%A in('more+5%%f')do”只输出第1-2,5,6列。起初我认为这可能与某些列为空有关,但在本例中,第7列和第8列的情况并非如此。批处理当前准备总共4列,要添加更多附加变量,
,%%E,%%F…
空列是个问题,因为相邻的分隔符被计为一个。感谢您的快速帮助。我通过将这两个代码粘贴到.bat文件中来尝试这两个代码,但两个代码似乎都不起作用。也没有Output.csv文件。有没有办法从我的角度解决这个问题?问题是重定向和我从代码中接管的开始括号之间缺少空格。改变了。啊,好的。代码现在运行和工作时只有一个例外:例如,“for/f”标记=1-2,5-9,12-13,17-19,21 delims=,“%%A in('more+5%%f')do”只输出第1-2,5,6列。起初我认为这可能与某些列为空有关,但在本例中,第7列和第8列的情况并非如此。批处理当前准备总共4列,以添加更多附加变量
,%%E,%%F…
空列是一个问题,因为相邻的分隔符被计为一个。图片没有多大帮助,因为它没有显示真正的csv文件,或者如果它包含机密信息,则至少显示一个无效版本。而不是图片,而是复制和粘贴的文本。我慢慢开始觉得自己在浪费时间。我是新来的,很抱歉。当然,粘贴文本完全有意义。复制了文件中更改的内容。要保留哪些列?前9个和后2个?图片没有多大帮助,因为它没有显示真正的csv文件,或者如果它包含机密信息,则至少显示一个无效版本。而不是图片,而是复制和粘贴的文本。我慢慢开始觉得自己在浪费时间。我是新来的,很抱歉。当然,粘贴文本完全有意义。复制了文件中更改的内容。要保留哪些列?前9个和后2个?太酷了,正是我需要的。我现在所做的是