[Risolto] Terminatore di riga CR+LF a macro estr. dati txt

Creare una macro - Scrivere uno script - Usare le API
Rispondi
Fabian F.
Messaggi: 4
Iscritto il: domenica 31 gennaio 2021, 16:03

[Risolto] Terminatore di riga CR+LF a macro estr. dati txt

Messaggio da Fabian F. »

Buongiorno,
sto sviluppando un foglio elettronico che dovrà funzionare su un Raspberry Pi (con sistema operativo RasbianOS).
All'interno del foglio elettronico sono presenti alcune macro che mi serviranno per "automatizzare" dei processi legati alla mia attività lavorativa.
Tra queste macro c'è quella che utilizzo per "esportare un range di dati in un file semplice di tipo .txt" (macro reperita all'interno della community di OpenOffice Forum che ringrazio).

il codice è questo:

Codice: Seleziona tutto

Sub

oSheet = ThisComponent.getCurrentController.ActiveSheet
   srange =  oSheet.getCellRangeByName("a1").String
   
   oRange = oSheet.getCellRangeByName(srange)
   CellContentArray = oRange.getDataArray()
   sFileName = "C:\Users\Admin\Desktop\AppORDINI\barcode.txt" '<<<<<<<<<<<<<<<< modificare
   n = FreeFile()
   Open  ConvertToUrl(sFileName) For Output As #n
   For i = 0 To UBound(CellContentArray)
     For j = 0 To UBound(CellContentArray(i))
       print #n, str(CellContentArray(i)(j));
     next
     print #n   
   Next
   
   Close #n

End Sub
il codice funzione molto bene sia in ambiente Windows sia in ambiente Linux facendo esattamente quello di cui ho bisogno.

il mio problema è il seguente:

quando il file .txt (nel mio caso barcode.txt) viene creato in ambiente Linux i terminatori di riga sono LF (mentre Windows utilizza CR+LF) e inviando il file su ambiente Windows il file si presenta con i dati su un'unica riga.
Per risolvere questo problema potrei utilizzare Notepad++ per convertire il carattere di fine linea (dal formato UNIX (LF) al formato Windows (CR+ LF)) ma non è la soluzione migliore in quanto gli utilizzatori di questo "automatismo" non sono molto pratici di informatica e poi aggiungerei un passaggio che vorrei evitare.

Detto questo voglio anche precisare che ho provato ad aggiungere chr(13) (il carattere di fine linea "CR") in questo modo:

Codice: Seleziona tutto

print #n, str(CellContentArray(i)(j)) + chr(13);
ma senza risultato.

Esiste un modo per "scrivere" questa estrazione direttamente con interruttore di linea CR+LF;
oppure esiste un codice che, direttamente da macro, mi modifica questo file convertendolo e impostandolo a CR+LF.

Grazie del prezioso aiuto,
Cordiali Saluti
Ultima modifica di charlie il mercoledì 3 febbraio 2021, 9:52, modificato 3 volte in totale.
Motivazione: Aggiunto [Risolto]
OpenOffice 4.1,5 su Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Impostare "terminatore di riga" CR+LF a macro per estraz

Messaggio da patel »

Se ho capito bene se fai girare la macro su win ottieni il risultato voluto, se la fai girare su linux invece no e tu la vuoi far girare su Linux. Ho capito bene ? prova così

Codice: Seleziona tutto

   oSheet = ThisComponent.getCurrentController.ActiveSheet
   srange =  oSheet.getCellRangeByName("a1").String
   
   oRange = oSheet.getCellRangeByName(srange)
   CellContentArray = oRange.getDataArray()
   sFileName = "C:\Users\Admin\Desktop\AppORDINI\barcode.txt" '<<<<<<<<<<<<<<<< modificare
   n = FreeFile()
   Open  ConvertToUrl(sFileName) For Output As #n
   For i = 0 To UBound(CellContentArray)
     For j = 0 To UBound(CellContentArray(i))
       print #n, str(CellContentArray(i)(j));
     next
     print #n , chr(13) 
   Next
   
   Close #n
Ovviamente se la fai girare su win otterrai delle righe vuote
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Fabian F.
Messaggi: 4
Iscritto il: domenica 31 gennaio 2021, 16:03

Re: Impostare "terminatore di riga" CR+LF a macro per estraz

Messaggio da Fabian F. »

Ciao patel,
ti ringrazio della risposta.
la macro originale funziona su entrambi i sistemi (sia su Win che su Linux).

La differenze sta nel fatto che su Linux il "carattere" di fine riga è LF, mentre su Windows c'è bisogno di due "caratteri" CR+LF.
In altre parole, quando la macro viene eseguita su linux, quindi viene creato il file .txt, questo su windows vine riconosciuto su un'unica riga in quanto manca il carattere CR. Diciamo che è un problema di codifica generale tra UNIX e WINDOWS, la macro in se funziona.

Come si può' notare dagli allegati, ecco la differenza che c'è nel generare il file su Linux oppure su Win.

Il mio obbiettivo è generare il file su Linux (sul raspberry pi) e inviarlo su Windows avendo il carattere di fine linea formattato in linguaggio windows, CR+LF.

Ho comunque provato con il tuo codice ma non ha funzionato.

Grazie
Allegati
file generato con la macro su Win
file generato con la macro su Win
file generato con la macro su Linux
file generato con la macro su Linux
OpenOffice 4.1,5 su Windows 7
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8786
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Impostare "terminatore di riga" CR+LF a macro per estraz

Messaggio da charlie »

Ciao @Fabian F. e benvenuto/a sul forum.
Se ti vuoi presentare, farai cosa gradita. Puoi farlo in questa sezione -> viewforum.php?f=16

L’utente che apre un quesito si impegna: In caso di inosservanza saremo costretti ad azioni di “richiamo”, sospensione o chiusura del profilo utente.

Buon proseguimento.
charlie
macOS 14.3 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Impostare "terminatore di riga" CR+LF a macro per estraz

Messaggio da patel »

Purtroppo io non ho una distro linux installata e non posso fare prove, però invece di print # prova ad usare Put # che permette l'accesso binary. Trovi esempi sulla guida di Pitonyak
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Fabian F.
Messaggi: 4
Iscritto il: domenica 31 gennaio 2021, 16:03

Re: Terminatore di riga CR+LF a macro per estrazione dati in

Messaggio da Fabian F. »

Buongiorno,
dopo aver fatto alcune ricerche ho trovato la soluzione.

In ambiente Linux esiste un programma da terminale che esegue la coversione di un file di testo dal formato DOS al formato UNIX e viceversa. Il programma da installare è "dos2unix", con la seguente riga di comando da terminale:

Codice: Seleziona tutto

sudo apt-get update

Codice: Seleziona tutto

sudo apt-get install dos2unix
Dopo aver installato questo programma, all'interno della macro, prima di "end sub", ho aggiunto il codice per eseguire una Shell, in questo modo:

Codice: Seleziona tutto

shell "bash -c 'unix2dos /home/pi/Documents/barocode.txt'" 'prcorso del file da modificare con interrutori di riga compatibili con windows
In questo modo, con la macro riesco ad eseguire l'estrazione dei miei dati in un file di testo e subito dopo lo modifico, convertendolo con UNIX2DOS.
OpenOffice 4.1,5 su Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Terminatore di riga CR+LF a macro per estrazione dati in

Messaggio da patel »

Mi sembra una buona soluzione, grazie di averla condivisa.
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
nickGiard
Messaggi: 65
Iscritto il: lunedì 14 maggio 2012, 22:04

Re: [Risolto] Terminatore di riga CR+LF a macro estr. dati t

Messaggio da nickGiard »

Intervengo dopo molto tempo, ma sperando che le mie considerazioni siano comunque utili.
Mi sembra che il file in questione sia di tipo String, e quindi si tratta di definire il terminatore di riga.
Il doppio ciclo su CellContentArray lo userei per ricopiate le stringe in un Array() ad una dimensione.
La stringa risultante posso ottenerla semplicemente con Join(Array(), sSeparatore) dove sSeparatore = Chr(10) oppure Chr(13) & Chr(10) e quindi salvarla su file.
Faccio presente un'utile procedura UCB.SaveDataToFile presente nella libreria Tools, che salva su file un Array usando Chr(13) & Chr(10) come separatori, e dalla quale puoi ottenere delle utilissime informazioni per salvare la tua stringa su file.
Tutto questo per dire che semplici manipolazioni di stringhe forse non richiedono particolari tools di trasformazione.
Nicola con LibreOffice 7.1 (x64) su Windows 11
Rispondi