Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    unire i files a seconda del loro contenuto

    ciao a tutti e buon fine settimana. il mio se non risolvo in qualche modo il compito che mi hanno assegnato sarà pessimo.

    Ho una cartella che contiene diverse centinaia di files di testo. i nomi non seguono alcuno schema.

    mi spiego con un esempio

    fileuno.txt
    catalogo1
    prodotto 1
    prodotto 2

    filedue.txt
    catalogo2
    prodotto 3
    prodotto 5

    filetre.txt
    catalogo1
    prodotto 10
    prodotto 20

    altrofile.txt
    catalogo2
    prodotto 40
    prodotto 50

    altrofile2.txt
    catalogo3
    prodotto 1000
    prodotto 2000

    e così via

    a partire da questi file ne dovrei creare altri quante sono le prime righe diverse (quindi nel mio esempio dovrei avere catalogo1.txt,catalogo2.txt e catalogo3.txt) e dovrei copiare il testo di ciascun file in quello corrispondente ottenendo

    catalogo1.txt
    catalogo1
    prodotto 1
    prodotto 2
    catalogo1
    prodotto 10
    prodotto 20


    catalogo2.txt
    catalogo2
    prodotto 3
    prodotto 5
    catalogo2
    prodotto 40
    prodotto 50

    catalogo3.txt
    catalogo3
    prodotto 1000
    prodotto 2000

    l'ordine nel quale si uniscono i contenuti dei files non è imporante. qualcuno ha una minima idea di come automatizzare la procedura? grazie e ancora buon fine settimana.

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Ciao.
    Ricordo da precedenti thread che hai già usato la powershell.
    Allora, scarica powershell analyzer da qui

    http://shelltools.wik.is/Downloads

    Scompattala e lancia l'eseguibile PowerShellAnalyzer.exe
    Il programma è standalone.
    A questo punto nell'editor incolla il codice che ti ho scritto. Devi solo modificare il percorso della variabile $path. All'interno della cartella te ne verrà creata un'altra di nome nuovi con tutti i tuoi file.
    Il fine settimana è salvo.

    codice:
    # Imposto il path della cartella contenente i file originali
    $path = "C:\Documents and Settings\Nicola\Desktop\txtfile"
    # .. e la raggiungo tramite set-location
    set-Location $path
    # recupero l'elenco di tali file
    $filesorig = Get-ChildItem $path
    # all'interno della cartella ne creo una nuova di nome nuovi in cui inserirò i file che creerò
    new-Item -type directory -name nuovi 
    # recupero l'elenco dei file (escludendo la cartella appena creata)
    # di ciascuno ricavo la prima riga tramite gc[0], ordino tali righe, ricavo solo quelle uniche
    # e creo tanti file quante sono le prime righe univoche dando loro il nome di tale riga e l'estensione .txt
    gci | ? {-not $_.psiscontainer} | % { (gc $_)[0] } | Sort-Object | Get-Unique | % {new-Item -path ($path+"\nuovi\") -type file -name ($_+".txt") }  
    # ricavo l'elenco dei file appena creati
    $filesdest = Get-ChildItem ($path+"\nuovi") 
    # ciclo i file di origine, i file di destinazione vuoti appena creati
    # e quando la prima riga del file di origine coincide col nome privo di estensione del file creato gli accodo il contenuto del file di origine
    foreach($fileorig in $filesorig) {
                                        foreach($filedest in $filesdest) { 
                                                 if ( (gc $fileorig)[0] -eq [IO.Path]::GetFileNameWithoutExtension($filedest.name)  ) {
                                                        foreach($riga in gc $fileorig) {
                                                             add-content -path ($path+"\nuovi\"+$filedest.name) -value $riga 
                                                        }
                                                  }
                                         } 
    }

  3. #3
    non ci credo. funziona!!!!!
    non pensavo che qualcuno mi avrebbe risolto il problema, tanto meno così velocemente. grazie mille Nicola, sei stato gentilissimo.
    non vorrei approfittare della tua gentilezza ma vorrei chiederti un'altra cosa: nel caso voglia rimuovere da ogni file tutte le righe catalogo1,catalogo2 e così via come potrei fare?
    un'altra domanda. visto che mi sto rendendo conto che questa powershell mi risolverebbe un sacco di problemi a lavoro da dove posso iniziare a studiarla? puoi darmi qualche dritta?
    ciao, complimenti e grazie ancora.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Allora, per rimuovere tutte le ripetizioni della prima riga all'interno di ciascun file fai così:

    codice:
    # Imposta il percorso della cartella che contiene i file nuovi che son stati creati
    $path = "C:\tuo_path\nuovi" 
    set-Location $path
    $files = get-ChildItem $path
    foreach($file in $files) {
    get-Content $file | ? {$_ -ne (get-Content $file)[0]} | out-File ([IO.Path]::GetFileNameWithoutExtension($file.name)+"_pulito.txt")
    }
    Il codice non fa altro che ciclare tutti i file ed estrarre da ciascuno tutte le righe il cui contenuto è diverso dalla prima riga di ognuno. L'output viene poi reindirizzato tramite il cmdlet out-file generando dei nuovi file.

    Documentazione italiana di powershell ne esiste poca.
    Ti posso consigliare il sito
    www.powershell.it dove esiste anche un forum specifico. Il sito è gestito da Efran Cobisi, un ragazzo davvero preparato e gentile a cui anche io chiedo spesso aiuto ottenendo sempre ottimi consigli.
    C'è poi un forum (in inglese) efficientissimo a questo indirizzo
    http://www.vistax64.com/powershell/

    dove mi capita spesso che per un problema mi vengano fornite anche 3-4 soluzioni differenti.
    E' frequentato da fenomeni e anche dallo stesso inventore della shell.

    Che io sappia non esiste un solo libro in italiano sulla powershell.
    Qui trovi un elenco dei libri in inglese sull'argomento
    http://books.google.it/books?q=power...-8&sa=N&tab=wp

    Se non hai problemi con l'inglese ti consiglierei Windows Powershell in action e Pro Windows PowerShell, entrambi molto chiari.

  5. #5
    lo script ha fatto esattamente quello che avevo chiesto.
    ti ringrazio ancora molto, sia per il codice che per i consigli. vedrò di procurarmi uno dei libri che mi hai indicato.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.