[Résolu][Calc] Suppression retour chariot avant import CSV

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: 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 !
cedric86fr
Membre OOrganisé
Membre OOrganisé
Messages : 85
Inscription : 22 avr. 2022 13:28

[Résolu][Calc] Suppression retour chariot avant import CSV

Message par cedric86fr »

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 ?
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
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 10110
Inscription : 28 août 2010 08:45

Re: [Calc] Suppression retour chariot avant import CSV

Message par micmac »

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.
Touche Ctrl de Windows = touche cmd⌘ sur Mac
OpenOffice > Outils > Options sur Windows = OpenOffice > Préférences sur macOS
cedric86fr
Membre OOrganisé
Membre OOrganisé
Messages : 85
Inscription : 22 avr. 2022 13:28

Re: [Calc] Suppression retour chariot avant import CSV

Message par cedric86fr »

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
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1195
Inscription : 19 août 2018 05:20

Re: [Calc] Suppression retour chariot avant import CSV

Message par Dolev »

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.
Open Office 4.1.16 sous Windows 11
cedric86fr
Membre OOrganisé
Membre OOrganisé
Messages : 85
Inscription : 22 avr. 2022 13:28

Re: [Calc] Suppression retour chariot avant import CSV

Message par cedric86fr »

Bonjour Dolev,

Et merci du retour.
Je constate d'abord que votre fichier n'est pas un CSV et ne respecte pas le format.
Pour être considéré comme CSV le fichier doit obligatoirement être encodé en UTF-8 ?

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()
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 ?



 Ajout : 

J'ai trouvé quelques exemples sur les REGEX mais je n'arrive pas à brancher la variable ligne sur createReplaceDescriptor :marto:

Code : Tout sélectionner

Dim oSFA As Object, oInText As Object, Document as Object, Remplacer as Object
Dim Ligne As String
Document = ThisComponent
MaFeuille = Document.CurrentController.ActiveSheet

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

Remplacer = MaFeuille.createReplaceDescriptor
Remplacer.SearchRegularExpression = True
Remplacer.SearchString = "EDITION"
Remplacer.SearchWords = True
Remplacer.ReplaceString = "TEST"
MaFeuille.replaceAll(Remplacer)
Print Ligne

Loop
oInText.closeInput()
 
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
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1195
Inscription : 19 août 2018 05:20

Re: [Calc] Suppression retour chariot avant import CSV

Message par Dolev »

Re,

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
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 639
Inscription : 09 août 2017 22:15

Re: [Calc] Suppression retour chariot avant import CSV

Message par Jurassic Pork »

Hello,
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, 
[Python] (bien) débuter avec LibreOffice ou OpenOffice

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
cedric86fr
Membre OOrganisé
Membre OOrganisé
Messages : 85
Inscription : 22 avr. 2022 13:28

Re: [Calc] Suppression retour chariot avant import CSV

Message par cedric86fr »

Bonjour JP,

Je te remercie d'essayer de répondre clairement à ma question avec du code :super:

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"), "")
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...
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
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 639
Inscription : 09 août 2017 22:15

Re: [Calc] Suppression retour chariot avant import CSV

Message par Jurassic Pork »

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 windows le python est installé avec LibreOffice et pas besoin forcément d'APSO pour pouvoir exécuter une macro en python :

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 :
PythonImportCSV.png
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
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1195
Inscription : 19 août 2018 05:20

Re: [Calc] Suppression retour chariot avant import CSV

Message par Dolev »

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 :

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é
Membre OOrganisé
Messages : 85
Inscription : 22 avr. 2022 13:28

Re: [Calc] Suppression retour chariot avant import CSV

Message par cedric86fr »

Merci Dolev :super:

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
Avatar de l’utilisateur
ddorange
Membre hOOnoraire
Membre hOOnoraire
Messages : 121
Inscription : 23 déc. 2015 18:49
Localisation : Annecy

Re: [Calc] Suppression retour chariot avant import CSV

Message par ddorange »

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 ?
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.
LibreOffice 25.2 et OpenOffice 4.1.15 sous Ubuntu 25.04, Windows 7, Windows 11, MacOs Sonoma
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 639
Inscription : 09 août 2017 22:15

Re: [Calc] Suppression retour chariot avant import CSV

Message par Jurassic Pork »

Hello,
ddorange a écrit : 23 avr. 2024 17:45 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.
:aie: 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
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
cedric86fr
Membre OOrganisé
Membre OOrganisé
Messages : 85
Inscription : 22 avr. 2022 13:28

Re: [Calc] Suppression retour chariot avant import CSV

Message par cedric86fr »

Ca fonctionne parfaitement, merci beaucoup Dolev :super:
Libreoffice 7.2.7.2.M7 (x64) (obligation de version) sur Windows 10
Avatar de l’utilisateur
Dude
IdOOle de la suite
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

Message par Dude »

Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues