3 messaggi dal 13 marzo 2017
Buongiorno a tutti del Forum, sono un nuovo iscritto e non so se questa sia la sezione giusta per porre il mio problema, diciamo che sono andato un po' a naso :)

Detto ciò vi chiederei un aiuto per la creazione di un eseguibile .bat oppure .vbs che mi possa eliminare le righe di un file csv confrontando la data di quando viene avviato con quella registrata nella colonna.

Entrando nel dettaglio, io ricevo un file csv con questa struttura di dati (questo è un esempio):

28/01/2017 04:00;0,000;0,000;0,000;0,00;0;0;0;0,00;0;0
29/01/2017 04:00;0,000;0,000;0,000;0,00;0;0;0;0,00;0;0
30/01/2017 04:00;0,000;0,000;0,000;0,00;0;0;0;0,00;0;0
31/01/2017 04:00;0,000;0,000;0,000;0,00;0;0;0;0,00;0;0
01/02/2017 04:00;;;;;;;;;;
02/02/2017 04:00;;;;;;;;;;

il mio problema principale è che di programmazione ne capisco ancora abbastanza poco, quindi non riesco a capacitarmi quali istruzioni mi possono essere utili per fare questa semplice (credo essendo ignorante in materia) cosa, eliminare le righe con data maggiore di quella attuale.

Questo perché nel mio file sono presenti le date per 2 anni consecutivi che ogni giorno vengono popolate da un programma.

Altro problema è che il mio applicativo non riesce a scrivere i dati attuali e passati in un database perché le date future lo inceppano.

Vi ringrazio in anticipo per la vostra disponibilità per l'aiuto che mi darete

Buona giornata
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo e benvenuto nel forum!


il mio applicativo non riesce a scrivere i dati attuali e passati in un database perché le date future lo inceppano.

Il tuo applicativo in che linguaggio è scritto? Se risolvessi il problema che lo "inceppa" potresti evitare di dover filtrare il file CSV originale, prima di elaborarlo. In caso posta un po' di codice e l'errore che stai avendo.
L'errore tipico che si verifica lavorando con le date è che il programma cerca di interpretarla nel formato anglosassone (mm/gg/aaaa) ma ovviamente non ci riesce quando incontra un valore tipo 24/03/2017, perché ovviamente 24 non è un valore valido per il mese.

Comunque, volendo filtrare le righe del file di testo, puoi cavartela velocemente con PowerShell. Crea un file .ps1 (è eseguibile) e mettici dentro questo, avendo cura di sostituire i percorsi del file di input e di output.

$inputFile = "D:\input.csv"
$outputFile = "D:\output.csv"
Get-Content $inputFile | where {$_.Length -ge 16 -and [System.DateTime]::ParseExact($_.Substring(0, 16), "dd/MM/yyyy HH':'mm", $null) -lt [System.DateTime]::Now} | Out-File $outputFile


Si spiega così:
  • Get-Content $inputFile una ad una, legge tutte le righe dal file di origine;
  • | where filtra ciascuna riga letta dal comando precedente
  • $_.Length -ge 16 affinché venga considerata, è necessario che la riga sia lunga almeno 16 caratteri (la data);
  • -and [System.DateTime]::ParseExact($_.Substring(0, 16), "dd/MM/yyyy HH':'mm", $null) -lt [System.DateTime]::Now inoltre verifichiamo che la data non sia superiore a quella attuale. Il parsing della data avviene secondo il tuo formato gg/mm/aaaa hh:mm
  • | Out-File $outputFile ogni riga "sopravvissuta" al filtro, viene scritta nel file di destinazione


ciao,
Moreno

Enjoy learning and just keep making
3 messaggi dal 13 marzo 2017
Ciaoo!

Grazie mille per la risposta e per il programma PowerShell, ho provato ad eseguirlo sostituendo il percorso, ma non ottengo il secondo file di output, in più mi risulta un errore che non riesco a leggere.

Ti riporto una parte di dati:

18/01/2017 04:00;54,800;39,216;32,548;223,20;15283;0;0;8806,50;52;-350
19/01/2017 04:00;54,217;42,557;22,309;202,50;0;0;0;5398,20;-158212;-82563
20/01/2017 04:00;0,000;0,000;0,000;471,60;15049;0;0;3131,10;0;0
21/01/2017 04:00;0,000;0,000;0,000;1220,40;0;0;0;13261,50;0;0
22/01/2017 04:00;0,000;0,000;0,000;1219,50;0;0;0;13261,50;0;0

Forse è perché input ed output devo vere lo stesso nome?

Comunque grazie mille per l'aiuto

Ciaooo
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Forse è perché input ed output devo vere lo stesso nome?

Sì, il problema è quello, non puoi contemporaneamente leggere e scrivere sullo stesso file.
Dovresti scrivere su un altro file, come da esempio.
Al termine della scrittura, puoi eliminare il vecchio file e rinominare il nuovo.

ciao,
Moreno

Enjoy learning and just keep making
3 messaggi dal 13 marzo 2017
Perfetto, grazie mille per la spiegazione

Buona settimana

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.