[Résolu][Calc] Suppression retour chariot avant import CSV
Modérateur : Vilains modOOs
Règles du forum
Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
-
cedric86fr
- Membre OOrganisé

- Messages : 85
- Inscription : 22 avr. 2022 13:28
[Résolu][Calc] Suppression retour chariot avant import CSV
Bonjour,
J'exporte un fichier CSV d'un logiciel de compta que je retraite ensuite par macro. Lorsqu'un agent utilise le retour chariot pour annoter le workflow, le retour chariot se retrouve dans la colonne observation de l'export CSV et la macro dysfonctionne.
En ouvrant le CSV dans Notepad++, je vois que chaque ligne du fichier CSV se termine par LF, et les lignes avec un retour chariot par CRLF.
Pour corriger le problème dans Notepad++, il suffit de chercher \n\r et remplacer par rien puis enregistrer le csv, et la macro fonctionne à nouveau.
Mais comment puis-je faire pour automatiser cette correction depuis Calc ?
J'exporte un fichier CSV d'un logiciel de compta que je retraite ensuite par macro. Lorsqu'un agent utilise le retour chariot pour annoter le workflow, le retour chariot se retrouve dans la colonne observation de l'export CSV et la macro dysfonctionne.
En ouvrant le CSV dans Notepad++, je vois que chaque ligne du fichier CSV se termine par LF, et les lignes avec un retour chariot par CRLF.
Pour corriger le problème dans Notepad++, il suffit de chercher \n\r et remplacer par rien puis enregistrer le csv, et la macro fonctionne à nouveau.
Mais comment puis-je faire pour automatiser cette correction depuis Calc ?
Dernière modification par cedric86fr le 21 mai 2024 07:43, modifié 1 fois.
Libreoffice 7.2.7.2.M7 (x64) (obligation de version) sur Windows 10
-
micmac
- RespOOnsable forum

- Messages : 10110
- Inscription : 28 août 2010 08:45
Re: [Calc] Suppression retour chariot avant import CSV
Bonjour,
Pour être aidé efficacement par les bénévoles de ce forum, veuillez fournir dans votre prochain message les éléments suivants :
1. le code de la macro
2. un classeur explicatif avec les données nécessaires
3. un mode pas-à-pas permettant de reproduire ce qui a été fait ou ce que vous cherchez à faire.
Pour être aidé efficacement par les bénévoles de ce forum, veuillez fournir dans votre prochain message les éléments suivants :
1. le code de la macro
2. un classeur explicatif avec les données nécessaires
3. un mode pas-à-pas permettant de reproduire ce qui a été fait ou ce que vous cherchez à faire.
Touche Ctrl de Windows = touche cmd⌘ sur Mac
OpenOffice > Outils > Options sur Windows = OpenOffice > Préférences sur macOS
OpenOffice > Outils > Options sur Windows = OpenOffice > Préférences sur macOS
-
cedric86fr
- Membre OOrganisé

- Messages : 85
- Inscription : 22 avr. 2022 13:28
Re: [Calc] Suppression retour chariot avant import CSV
Désolé, j'ai oublié la PJ. La voilà
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libreoffice 7.2.7.2.M7 (x64) (obligation de version) sur Windows 10
-
Dolev
- SuppOOrter

- Messages : 1195
- Inscription : 19 août 2018 05:20
Re: [Calc] Suppression retour chariot avant import CSV
Bonsoir,
Je constate d'abord que votre fichier n'est pas un CSV et ne respecte pas le format.
Il faut utiliser le service TextInputStream. Vous pourrez ainsi lire chaque ligne et supprimer chaque retour chariot (CR) rencontré.
Faire une recherche dans le forum pour trouver des exemples.
Je constate d'abord que votre fichier n'est pas un CSV et ne respecte pas le format.
Il faut utiliser le service TextInputStream. Vous pourrez ainsi lire chaque ligne et supprimer chaque retour chariot (CR) rencontré.
Faire une recherche dans le forum pour trouver des exemples.
Open Office 4.1.16 sous Windows 11
-
cedric86fr
- Membre OOrganisé

- Messages : 85
- Inscription : 22 avr. 2022 13:28
Re: [Calc] Suppression retour chariot avant import CSV
Bonjour Dolev,
Et merci du retour.
J'ai ajouté ce morceau
Mais je ne sais pas comment :
- utiliser les expressions régulières pour remplacer CRLF par rien en basic.
- enregistrer le fichier csv pour le repasser dans le filtre d'import ? ou envoyer directement la variable Ligne dans le filtre d'import ?
Et merci du retour.
Pour être considéré comme CSV le fichier doit obligatoirement être encodé en UTF-8 ?Je constate d'abord que votre fichier n'est pas un CSV et ne respecte pas le format.
J'ai ajouté ce morceau
Code : Tout sélectionner
Dim oSFA As Object, oInText As Object
Dim FichierURL As String, Ligne As String
oSFA = createUNOService("com.sun.star.ucb.SimpleFileAccess")
oInText = createUNOService("com.sun.star.io.TextInputStream")
oInText.setInputStream(oSFA.openFileRead(MonFichier))
Do while Not oInText.isEOF
Ligne = oInText.readLine()
'Print Ligne
Loop
oInText.closeInput()- utiliser les expressions régulières pour remplacer CRLF par rien en basic.
- enregistrer le fichier csv pour le repasser dans le filtre d'import ? ou envoyer directement la variable Ligne dans le filtre d'import ?
| Ajout :
J'ai trouvé quelques exemples sur les REGEX mais je n'arrive pas à brancher la variable ligne sur createReplaceDescriptor Code : Tout sélectionner |
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libreoffice 7.2.7.2.M7 (x64) (obligation de version) sur Windows 10
-
Dolev
- SuppOOrter

- Messages : 1195
- Inscription : 19 août 2018 05:20
Re: [Calc] Suppression retour chariot avant import CSV
Re,
A mon avis, j'utiliserai plutôt la méthode readBytes afin de savoir si le caractère rencontré est un retour chariot.
A mon avis, j'utiliserai plutôt la méthode readBytes afin de savoir si le caractère rencontré est un retour chariot.
Open Office 4.1.16 sous Windows 11
-
Jurassic Pork
- PassiOOnné

- Messages : 639
- Inscription : 09 août 2017 22:15
Re: [Calc] Suppression retour chariot avant import CSV
Hello,
une solution en macro python (importCSV) en utilisant un fichier temporaire :
[Python] (bien) débuter avec LibreOffice ou OpenOffice
Ami calmant, J.P
une solution en macro python (importCSV) en utilisant un fichier temporaire :
Code : Tout sélectionner
# coding: utf-8
from __future__ import unicode_literals
import uno
import os
try:
CTX = uno.getComponentContext()
SM = CTX.getServiceManager()
desktop = XSCRIPTCONTEXT.getDesktop()
ODOC = desktop.getCurrentComponent()
parentwin = ODOC.CurrentController.Frame.ContainerWindow
dispatcher = SM.createInstanceWithContext("com.sun.star.frame.DispatchHelper", CTX)
model = desktop.getCurrentComponent()
except:
print("ModulePython init Error")
def nettoyerCSV(fichierSrc,fichierTemp):
with open(fichierSrc, "rb") as file:
csvString = file.read().decode("iso-8859-1").replace("\r\n", "")
with open(fichierTemp, "w") as file:
file.write(csvString)
def clearSheetContent(sheet):
scc = sheet.createCursor()
scc.gotoStartOfUsedArea(False)
scc.gotoEndOfUsedArea(True)
sheet.getCellRangeByName(scc.AbsoluteName).clearContents(7)
def importCSV(*args):
filepicker = SM.createInstanceWithContext("com.sun.star.ui.dialogs.FilePicker", CTX)
filepicker.appendFilter("Classeurs Calc", "*.csv")
filepicker.CurrentFilter = "Classeurs Calc"
filepicker.Title = "Selectionner le fichier .csv "
#exécution et vérification du retour (OK)
if (filepicker.execute() > 0 ):
fichierSrc = uno.fileUrlToSystemPath(filepicker.Files[0])
print(fichierSrc)
else:
return
fichierTemp = "d:/temp/import3.csv"
nettoyerCSV(fichierSrc, fichierTemp)
oFeuille = ODOC.getSheets().getByName("Test")
clearSheetContent(oFeuille)
Filtre = "59,34,1,8,1/1/2/1/3/1/4/1/5/1/6/1/7/1/8/1/9/1/10/1/11/1/12/1/13/1/14/1/15/1/16/1/17/1/18/1/19/1/20/4/21/1/22/1/23/4/24/1/25/4/26/4/27/1/28/1/29/1"
oFeuille.link(uno.systemPathToFileUrl(fichierTemp), "", "Text - txt - csv (StarCalc)", Filtre, 2)
oFeuille.setLinkMode(0)
os.remove(fichierTemp)
g_exportedScripts = importCSV, Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
-
cedric86fr
- Membre OOrganisé

- Messages : 85
- Inscription : 22 avr. 2022 13:28
Re: [Calc] Suppression retour chariot avant import CSV
Bonjour JP,
Je te remercie d'essayer de répondre clairement à ma question avec du code
Mais je ne pense pas que mon administration apprécierait que j'installe APSO, et il faut surement avoir python d'installer sur le micro (??) ce qui n'est pas le cas.
J'ai vu que tu utilises replace en python qui peut se traduire par Join Split en basic. Ca fonctionne bien si je remplace EDITION par TEST dans la première ligne, cela fonctionne peut être avec \n\r et "" mais c'est moins évident de le voir !
Mais je ne vois pas du tout comment je peux récupérer toutes les lignes dans un nouveau fichier ou une nouvelle variable ??? pour ensuite le passer dans mon filtre d'import.
Par ailleurs, je n'ai toujours pas trouvé comment brancher ma variable ligne avec createReplaceDescriptor, si une âme charitable a la solution je suis preneur.
Pour la méthode readBytes je n'ai rien compris...
Je te remercie d'essayer de répondre clairement à ma question avec du code
Mais je ne pense pas que mon administration apprécierait que j'installe APSO, et il faut surement avoir python d'installer sur le micro (??) ce qui n'est pas le cas.
J'ai vu que tu utilises replace en python qui peut se traduire par Join Split en basic. Ca fonctionne bien si je remplace EDITION par TEST dans la première ligne, cela fonctionne peut être avec \n\r et "" mais c'est moins évident de le voir !
Code : Tout sélectionner
Ligne = Join(Split(Ligne, "\n\r"), "")Par ailleurs, je n'ai toujours pas trouvé comment brancher ma variable ligne avec createReplaceDescriptor, si une âme charitable a la solution je suis preneur.
Pour la méthode readBytes je n'ai rien compris...
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libreoffice 7.2.7.2.M7 (x64) (obligation de version) sur Windows 10
-
Jurassic Pork
- PassiOOnné

- Messages : 639
- Inscription : 09 août 2017 22:15
Re: [Calc] Suppression retour chariot avant import CSV
Sous windows le python est installé avec LibreOffice et pas besoin forcément d'APSO pour pouvoir exécuter une macro en python :cedric86fr a écrit : ↑21 avr. 2024 15:32 Mais je ne pense pas que mon administration apprécierait que j'installe APSO, et il faut surement avoir python d'installer sur le micro (??) ce qui n'est pas le cas.
Sous C:\Users\<nom utilisateur>\AppData\Roaming\LibreOffice\4\user\Scripts \Python tu crées un fichier qui s'appelle ModulePython.py et tu mets mon code dedans. On peut alors exécuter la macro importCSV par Outils/Macros/Exécuter la macro dans mes macros :
Attention dans mon code il faut que la feuille Test existe déjà et faut surement changer l'emplacement du fichier temporaire.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
-
Dolev
- SuppOOrter

- Messages : 1195
- Inscription : 19 août 2018 05:20
Re: [Calc] Suppression retour chariot avant import CSV
Finalement en s'inspirant de l'extension d'Alain de la Chaume qui remplace les retours ligne/chariot et vice versa :
viewtopic.php?t=37650
On peut faire l'opération en passant par Writer :
viewtopic.php?t=37650
On peut faire l'opération en passant par Writer :
Code : Tout sélectionner
Sub SupprimeRCdansCSV()
Dim props(2) As New com.sun.star.beans.PropertyValue
sCSV = convertToURL("c:\documents\test.csv")
props(0).Name = "FilterName"
props(0).Value = "Text (encoded)"
props(1).Name = "FilterOptions"
props(1).Value = "ISO-8859-15,CR"
props(2).name = "Hidden"
props(2).value = true
oDoc = StarDesktop.loadComponentFromURL(sCSV, "_blank", 0, props())
oTexte = oDoc.Text
'Fonction extraite de l'extension de Alain de La Chaume
'https://forum.openoffice.org/fr/forum/viewtopic.php?t=37650
oCursSel = oTexte.createTextCursorByRange(oTexte)
' Curseur d'écriture au début de la sélection
oCursEcr = oTexte.createTextCursorByRange(oTexte.start)
do
oCursEcr.gotoEndOfParagraph(true) ' Aller en fin de paragraphe
' Vérifier que la fin de sélection n'est pas dépassée ' !!!!!!!!
if oTexte.text.compareRegionEnds(_
oCursEcr, oCursSel) < 0 then exit do ' exit do !!!
oCursEcr.collapseToEnd
if oCursEcr.goRight(1, true) then
if acIsFP(oCursEcr.string) then
oCursEcr.collapseToStart
oCursEcr.goRight(2, true)
oCursEcr.string = ""
end if
else
exit do
end if
if oCursEcr.goRight(1, false) = false then exit do
oCursEcr.goLeft(1, false) ' Cas de séries de FP
loop
oDoc.store()
oDoc.dispose()
End Sub
function acIsFP(buf as string) as boolean
acIsFP = true
if (buf <> chr(13)) and (buf <> chr(10)) _
and (buf <> chr(13) & chr(10)) then
acIsFP = false
end if
end function
Open Office 4.1.16 sous Windows 11
-
cedric86fr
- Membre OOrganisé

- Messages : 85
- Inscription : 22 avr. 2022 13:28
Re: [Calc] Suppression retour chariot avant import CSV
Merci Dolev
Je vais regarder ce que ça donne sur mon micro (dans la semaine) et essayer d'insérer private:factory/swriter au bon endroit puisque dans l'idéal je dois ouvrir writer à partir d'un bouton dédié dans un classeur calc.
Je reviens plus tard faire part de mes investigations.
Je vais regarder ce que ça donne sur mon micro (dans la semaine) et essayer d'insérer private:factory/swriter au bon endroit puisque dans l'idéal je dois ouvrir writer à partir d'un bouton dédié dans un classeur calc.
Je reviens plus tard faire part de mes investigations.
Libreoffice 7.2.7.2.M7 (x64) (obligation de version) sur Windows 10
-
ddorange
- Membre hOOnoraire

- Messages : 121
- Inscription : 23 déc. 2015 18:49
- Localisation : Annecy
Re: [Calc] Suppression retour chariot avant import CSV
Bonsoir,
S'il s'agit de lire un fichier texte ligne par ligne, il suffit d'écrire Ligne = Replace(Ligne, Chr(10), ""), pour enlever le retour chariot qui est soit Chr(10) soit CHR(13).
Mais peut-être que je suis complètement à côté de la plaque.
Bonsoir,cedric86fr a écrit : ↑20 avr. 2024 11:36 Mais je ne sais pas comment :
- utiliser les expressions régulières pour remplacer CRLF par rien en basic.
- enregistrer le fichier csv pour le repasser dans le filtre d'import ? ou envoyer directement la variable Ligne dans le filtre d'import ?
S'il s'agit de lire un fichier texte ligne par ligne, il suffit d'écrire Ligne = Replace(Ligne, Chr(10), ""), pour enlever le retour chariot qui est soit Chr(10) soit CHR(13).
Mais peut-être que je suis complètement à côté de la plaque.
LibreOffice 25.2 et OpenOffice 4.1.15 sous Ubuntu 25.04, Windows 7, Windows 11, MacOs Sonoma
-
Jurassic Pork
- PassiOOnné

- Messages : 639
- Inscription : 09 août 2017 22:15
Re: [Calc] Suppression retour chariot avant import CSV
Hello,
ben oui je crois que tu es complètement à côté de la plaque car si on lit un fichier ligne par ligne c'est qu'on est certainement en mode lecture texte et dans ce cas la valeur de la variable ligne que tu récupères ne contient pas les caractères de saut de ligne , retour chariot.
Ami calmant, J.P
Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
-
cedric86fr
- Membre OOrganisé

- Messages : 85
- Inscription : 22 avr. 2022 13:28
Re: [Calc] Suppression retour chariot avant import CSV
Ca fonctionne parfaitement, merci beaucoup Dolev 
Libreoffice 7.2.7.2.M7 (x64) (obligation de version) sur Windows 10
-
Dude
- IdOOle de la suite

- Messages : 26209
- Inscription : 03 mars 2006 07:45
- Localisation : 127.0.0.1
Re: [Résolu][Calc] Suppression retour chariot avant import CSV
Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
Améliorez AOO et votez pour les issues