Pannello di Controllo Moderatore ]

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

Creare una macro - Scrivere uno script - Usare le API

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

Messaggioda Fabian F. » domenica 31 gennaio 2021, 16:44

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   Espandi visualeStringi visuale
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   Espandi visualeStringi visuale
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
Fabian F.
 
Messaggi: 4
Iscritto il: domenica 31 gennaio 2021, 16:03

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

Messaggioda patel » domenica 31 gennaio 2021, 17:33

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   Espandi visualeStringi visuale
   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
-------------------
OpenOffice 4.1 e Libre Office 6.4.1.2 su Windows 10
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
patel
Volontario attivo
Volontario attivo
 
Messaggi: 3600
Iscritto il: venerdì 30 aprile 2010, 7:04
Località: Livorno

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

Messaggioda Fabian F. » domenica 31 gennaio 2021, 18:30

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
txt con CR+LF.jpg
file generato con la macro su Win
txt con LF.jpg
file generato con la macro su Linux
OpenOffice 4.1,5 su Windows 7
Fabian F.
 
Messaggi: 4
Iscritto il: domenica 31 gennaio 2021, 16:03

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

Messaggioda charlie » lunedì 1 febbraio 2021, 8:58

Ciao @Fabian F. e benvenuto/a sul forum.
Se ti vuoi presentare, farai cosa gradita. Puoi farlo in questa sezione -> https://forum.openoffice.org/it/forum/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 10.12 Sierra: Open Office 4.1.9 - LibreOffice 6.4.6.2
http://www.charlieopenoffice.altervista.org
Avatar utente
charlie
Site Admin
Site Admin
 
Messaggi: 7294
Iscritto il: mercoledì 19 dicembre 2012, 10:50

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

Messaggioda patel » lunedì 1 febbraio 2021, 12:10

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
-------------------
OpenOffice 4.1 e Libre Office 6.4.1.2 su Windows 10
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
patel
Volontario attivo
Volontario attivo
 
Messaggi: 3600
Iscritto il: venerdì 30 aprile 2010, 7:04
Località: Livorno

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

Messaggioda Fabian F. » martedì 2 febbraio 2021, 9:07

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   Espandi visualeStringi visuale
sudo apt-get update

Codice: Seleziona tutto   Espandi visualeStringi visuale
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   Espandi visualeStringi visuale
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
Fabian F.
 
Messaggi: 4
Iscritto il: domenica 31 gennaio 2021, 16:03

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

Messaggioda patel » martedì 2 febbraio 2021, 18:59

Mi sembra una buona soluzione, grazie di averla condivisa.
-------------------
OpenOffice 4.1 e Libre Office 6.4.1.2 su Windows 10
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
patel
Volontario attivo
Volontario attivo
 
Messaggi: 3600
Iscritto il: venerdì 30 aprile 2010, 7:04
Località: Livorno


Torna a Macro e UNO API

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti