2016-03-31 23 views
0

Örnek dosyaları, her dosyanın üstbilgileriyle tek bir dosyada birleştirmek için kodu yazdım.Birden çok .csv dosyasını toplu iş ile birleştirirken üstbilgiyi kaldır

Girdi dosyaları:

File1:

[ Row : Header ],,,,,,,,, 
ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy 
00032116,21238,60304PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14 
00032116,21238,81790PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14 

Dosya 2:

[ Row : Header ],,,,,,,,, 
ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy 
00024067,15562,9942PRMI,1,2014-09-16,2016-12-31,gintgUser,gintgUser,2016-02-21 05:59:43,2016-02-21 05:59:43 
.210

Beklenen Çıktı:

[ Row : Header ],,,,,,,,, 
ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy 
00024067,15562,9942PRMI,1,2014-09-16,2016-12-31,gintgUser,gintgUser,2016-02-21 05:59:43,2016-02-21 05:59:43 
00032116,21238,60304PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14 
00032116,21238,81790PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14 

Gerçek Çıktı:

[ Row : Header ],,,,,,,,, 
ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy 
00024067,15562,9942PRMI,1,2014-09-16,2016-12-31,gintgUser,gintgUser,2016-02-21 05:59:43,2016-02-21 05:59:43 
00032116,21238,60304PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14 
[ Row : Header ],,,,,,,,, 
ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy 
00032116,21238,81790PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14 

Bu işlem için kullanılan kod aşağıda bulabilirsiniz:

@echo off 
break>Combined.csv 
cls 
setlocal enabledelayedexpansion 

if exist C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv del C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv 

dir /a-d /b C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ContractEligibility_*.csv>C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\dirfiles.txt 

cd C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ 

for /f "tokens=*" %%A in (C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\dirfiles.txt) do (
    set /p header=<%%A 
    if "!header!" neq "" (
     (echo(!header!)>Combined.csv 
     goto :break_for 
    ) 

) 
:break_for 

for /f "tokens=*" %%A in (C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\dirfiles.txt) do (
     more +1 %%A>>Combined.csv 
    ) 

del dirfiles.txt 
} 

Birisi lütfen bu sorunu çözmeme yardımcı olabilir. Ben betik toplu işlemek ve bu sorunu ayıklamak için bir neophyte duyuyorum.

varsayarak CSV dosyaları listesini içeren bir ara dosya için gerek okuyabilir ve başlıklarının kurtulmak için onun skip seçeneğini kullanarak, standart for döngü ve bir iç içe for /F döngü bunları birleştirmek (Orada
+1

Lütfen kod bölümlerini düzgün biçimlendirmeyi öğrenin; editir bölgesinde '{}' düğmesini kullanın ... – aschipfl

+1

http://stackoverflow.com/a/19592600/3664960 Çoğaltması – Magoo

+0

Aynı CSV dosyalarının biçimlendirmesini geliştirdim - bkz. [düzenle] (http://stackoverflow.com/q/36325776/5047996/3); Ben bir kopya-yapıştırma hatası olarak kabul ettim ve örnek çıktı dosyalarında bu satır oluşmadı çünkü ben örnek dosya 2, kesilmiş bir satırı kaldırdığımı unutmayın; Yanlış bir şey yapsaydım, bir kez daha yazıyı düzenlemekte özgürsün ... – aschipfl

cevap

0

başlık her zaman tek bir satırdır). CSV dosyaları belirli bir sıralama düzeni gerekiyorsa

> "C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv" (
    for %%F in ("C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ContractEligibility_*.csv") do (
     for /F "usebackq eol=| delims=" %%L in ("%%~F") do (
      echo(%%L 
      goto :LEAVE 
     ) 
    ) 
) 
:LEAVE 
>> "C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv" (
    for %%F in ("C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ContractEligibility_*.csv") do (
     for /F "usebackq skip=1 eol=| delims=" %%L in ("%%~F") do (
      echo(%%L 
     ) 
    ) 
) 

, bunun yerine başka bir for /F döngü gerekir: İlk başlık ilk yineleme üzerine bozuldu başka for/for /F Döngü yapısı alınabilir Bu işi yapmak için dir /B komutunun çıktısını ayrıştıran standart for döngüsü. senin görevin olur - handiest programlarından birini etrafında Unix/Linux dan - Eğer awk yüklemeden gibi hissettim Eğer

> "C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv" (
    set "FLAG=" 
    for %%F in ("C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ContractEligibility_*.csv") do (
     for /F "usebackq eol=| delims=" %%L in ("%%~F") do (
      echo(%%L 
      if defined FLAG goto :LEAVE 
      set "FLAG=#" 
     ) 
    ) 
) 
:LEAVE 
>> "C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv" (
    for /F "eol=| delims=" %%F in (' 
     dir /B /A:-D /O:D /T:W "C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ContractEligibility_*.csv" 
    ') do (
     for /F "usebackq skip=2 eol=| delims=" %%L in ("%%F") do (
      echo(%%L 
     ) 
    ) 
) 
+1

Yukarıdakiler için teşekkürler. Üçüncü sıradan itibaren ilk döngüden itibaren. Ayrıca topluluğa kullanıcı olarak yeniyim, bu yüzden biçimlendirme güncellemeleri için çok teşekkürler. –

+1

@kartikeya_aj, yani başlık 1 ve 2 satırlarına yayılıyor (örnek veri gösterileriniz gibi)? benim [değiştir] (http://stackoverflow.com/a/36327709/5047996/2) (yakında) ... – aschipfl

+0

evet başlık aslında 3 satır –

0

: Aşağıdaki örnek o zaman en yeni modifikasyon tarihleri ​​en eski dosyaları sıralar, iki satırlık başlığını alır çok basit hale gelir. Windows için here'dan edinilebilir.

Sonra sadece kullanabilirsiniz:

awk 'NR<3 || FNR>2' *.csv 

komutu açıklamak için, NRNumber of the Record (yani hat numarası) olduğunu bilmek gerekir ve ilk kayıt/hat için bir tane de başlar ilk dosya ve daha sonra her kayıt ile artar, bu yüzden sadece ilk dosyanın sadece ilk iki kaydı için 3'ten az olacaktır.Diğer yandan, FNR, aynıdır, ancak her yeni dosya açıldığında bire sıfırlanır, böylece her dosyanın ilk iki kaydı için 2'den az olur.

Özetle, komut diyor ki ... "Tüm giriş dosyalarının ilk iki satırından biri veya herhangi bir dosyanın 2 satırını geçiyorsa, herhangi bir satırı yazdırın."

Windows'da çift tırnaklı tek tırnak işaretlerini değiştirmeniz gerekebileceğini unutmayın.

gawk'u indirecekseniz, bu örnek için awk ile aynı şekilde çalışacağını unutmayın. Bu soru hakkında

1

Birkaç puan:

  • Bu soru bu soruya anda Windows Batch file execution error
  • tam bir kopyası mayın, biri 4 cevaplar vardır.
  • Cevabımda veri dosyalarınızın küçük bir bölümünü göndermenizi istedim, ancak hiç yanıt vermediniz.

EDIT: başlıkları İKİ satırları içerir: Biraz sorunun kilit noktası eklemek için bunu modifiye sonra

  • Bu bu soruya benim cevap kopyasıdır ben modifiye şartnamesine uygun olarak bir açıklamada gönderilen kod: her dosyada üç satırlık başlık vardır, ancak çıktıya 3. sırada yer verilmelidir.

    @echo off 
    setlocal enabledelayedexpansion 
    
    cls 
    
    REM cd C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ 
    
    set "header3=" 
    (for %%A in (*.csv) do (
    
        if not defined header3 (
         (set /p "header1=" & set /p "header2=" & set /p "header3=") <%%A 
         echo !header3! 
        ) 
    
        more +3 %%A 
    
    )) > Combined.txt 
    
    • Ve bu oluşturulan Combined.txt dosyası olduğunda yukarıdaki verilerle bu program çalıştırmak:

    .

    [ Row : Header ],,,,,,,,, 
    ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy 
    00032116,21238,60304PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14 
    00032116,21238,81790PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14 
    00024067,15562,9942PRMI,1,2014-09-16,2016-12-31,gintgUser,gintgUser,2016-02-21 05:59:43,2016-02-21 05:59:43 
    

    Gördüğünüz gibi çıktı istediğinizle aynı.

    DÜZENLEME: yayınlanmıştır girdi dosyaları gerçek dosyalarla aynı veri içermez yapar çünkü

    • Mesaj göndermeye soruları takip etmelidir ... modifikasyon test edemez ve Bir öncekinin aynı sorunuyla yeni sorular yayınlamayın.
    • Sorununuzun açıklamasında daha net olmanız ve örnek veriler göndermeniz gerekir.
  • +0

    @aanici: Şüphe duyduğumu söylediğim gibi farklı bir soru olarak da aynı şeyi yaptım. Bu sorunun çözülmediği forumun kurallarını ihlal ettiğimde üzgünüm, bu soruyu kaldırmalı mıyım? Ayrıca, yardımlarınız için teşekkür ederim. aslında üç başlık çizgisidir, ilk önce iki sıra üstbilgisi ve 4. satırdaki veriler tarafından takip edilen beyaz boşluktur. İlk iki satırı atlamak ve 3. başlıktan birini seçmek zorundayım. Aşağıdaki {for/f "tokens = * skip = 2" %% A'yı (C: \ Users \ kartikeya.avasthi \ Desktop \ Batch_Scripts \ dirfiles) denedim. txt) yapmak ( } ama işe yaramıyor –

    +1

    ** 1. ** Ben _never_, farklı bir soruyu yeniden göndermeniz gerektiğini söyledi! _: _ "dosyalarınızın küçük bir bölümünü ..." soru, yorumlarda ek veri göndermeyin! "_ ([yorumum] yeniden okuyabilirsiniz (http://stackoverflow.com/questions/36057140/windows-batch-file-execution-error/36064379#comment60158294_36064379)). sadece bir açık soruyu daha fazla cevap vermeden terk etmek kötü bir konuşmadır (bir konuşma gibi) – Aacini

    +1

    ** 2. ** Belki de bu sorunun ana noktasının başlıklarla ilgili olduğunu farketmediniz. Başlıklar ve sadece 3. sürümde yer almalıdır.Ancak, böyle önemli bir bilgi, _not_ soruda görünür, ancak yorumlarda (_ " lütfen yorumlarda ek bilgi göndermeyin! "_). Bu bilgiyi ** BU SORU ** 'ya eklemelisiniz (yeni bir dosyada _NOT_). Nasıl? _ "Soruyu düzenle" _. Nasıl? Sorunun altında görünen "düzenle" gri linki aracılığıyla, "windows" ve "batch-file" mavi etiketlerinin hemen altında ("paylaş" ve "kapat" arasında). – Aacini

    İlgili konular