2017-06-19 82 views
1

我最初的問題是將多個csv合併爲一個,每個刪除第一對行(在我的情況下爲5)和所有空白行。我能找到以下解決方案:合併csv文件但刪除最後一行和多列

@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 

任何人的想法?

+0

該圖片並沒有什麼幫助,因爲它沒有顯示真正的csv文件或者至少包含機密信息的中性版本。和plaese不是一個圖片,但複製和粘貼文本。我慢慢開始覺得浪費時間。 – LotPings

+0

我是新來的,很抱歉。完全理解粘貼文本的過程。複製了文件的修改內容。 – FatTwin

+0

你想保留哪些列?前9和後2? – LotPings

回答

0

新的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文件排除那些尾隨_dq_dq追加保存
  • strip 4 lines
  • 刪除不需要的列
  • 正確引用領域
  • 刪除最後一個TOTAL

完成。還有什麼是做:

  • 合併文件(沒有,現在只有一個,標題行)
  • 檢查最後一列真的有一個尾隨空格。
+0

太酷了,正是我需要的。我現在所做的就是將它保存爲一個Powershell腳本,在最後的inital .bat代碼之前添加,並且同時命名Powershell腳本和.bat。奇蹟般有效。非常感謝! >> @ECHO OFF PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command「&'%〜dpn0.ps1'」 PAUSE – FatTwin

+0

Upvoted您的答案,但它不會顯示,因爲我有不到15名聲譽。我會確保稍後再維修它。再次,非常感謝。 – FatTwin

0

IMO合併通常意味着添加列,而不是追加/連接到結尾。而不是更多,你可以使用"skip=5 delims="
要刪除最後一行,你可以將實際的行存儲在一個變種,並打印上一行。因爲這是在一個(代碼塊)裏面,所以你需要DelayedExpansion然後(什麼可能會刪除你的csv中的感嘆號)。

要刪除列,您需要指定分隔符和匹配的標記參數以省略不需要的列。
倘若 「delims =」,並希望從6

@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 

剝離列2和列5我的輸出樣本:

Output.csv 


FatTwin1.csv,1,3,4,6 
FatTwin2.csv,13,15,16,18 

爲了克服與空字段可以normalize該CSV問題文件通過im- /導出他們與PowerShell的雙引號的所有領域。

此cmd行將調用powershell導入-csv和export-csv當前文件夾中的所有csv文件,並將名稱附加_dq。這要求文件具有唯一列名稱的標題。

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

感謝您的快速幫助。我通過將它們粘貼到一個.bat文件中嘗試了兩種代碼,但似乎都不起作用。沒有Output.csv文件。有沒有辦法從我的最終解決這個問題? – FatTwin

+0

問題是重定向和我從代碼中接管的左括號之間缺少空格。改變。 – LotPings

+0

啊,好的。代碼現在運行並且有一個例外:例如, 「for/f」tokens = 1-2,5-9,12-13,17-19,21 delims =,「%% A in('more +5 %% f')do」只輸出列1- 2,5,6。起初我認爲這可能與某些列是空的有關,但在這種情況下列7和列8不是這種情況。 – FatTwin