Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1772 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Lecture fichier TXT caractère parasite ° →

n°2300300
Marc L
Posté le 06-05-2017 à 11:44:29  profilanswer
 

Reprise du message précédent :
 
            Oui les doublons sont conservés comme dans ton code et
            c'est tellement plus facile quand le besoin est clairement expliqué !
 
            L'erreur provient du fichier ne correspondant pas à ce que tu as posté et,
            sans indication précise de la ligne du fichier source et de la ligne de code déclenchant cette erreur,
            je ne pourrais deviner, tout au plus ajouter un test dans le code mais allongeant donc l'exécution …
 
            Donc il faut extraire les codes de la deuxième colonne sur neuf caractères,
            écrire dans le fichier résultat si ce n'est pas un doublon tout en remplaçant le caractère parasite,
            what else ?!


Message édité par Marc L le 06-05-2017 à 11:47:03
mood
Publicité
Posté le 06-05-2017 à 11:44:29  profilanswer
 

n°2300302
daniel-12
Posté le 06-05-2017 à 12:17:45  profilanswer
 

non, mon code enlevait les doublons  :D  
 
If Mid(SC, 15, 1) = " " Then
Print #1, Mid(SC, 6, 9) & "%" & Mid(SC, 55, 40)  
End If

n°2300303
daniel-12
Posté le 06-05-2017 à 12:20:45  profilanswer
 

les lignes sont faite comme cela
 
|PLA|F00010021                |00|000|SAPGEC      |OF|ENS GEOMETRIES ST2                      |18.06.2003|      |
|PLA|F00010021-H00            |00|000|SAPEXPL     |OF|ENS GEOMETRIES ST2                      |09.06.2003|      |
|PLA|F00010021_001            |00|000|SAPGEC      |OF|ENS GEOMETRIES ST2                      |18.06.2003|      |
|PLA|F00010021_001_H00        |00|000|SAPEXPL     |OF|ENS GEOMETRIES ST2                      |09.06.2003|      |
 
ce que je veux extraire c'est UNIQUEMENT cela=>  
F00010021%ENS GEOMETRIES ST2
 
 
donc ce que j'ai fais, c'est un test après F00010021, et s'il y a un espace je traite cette ligne
cette méthode est suffisante, vu comment sont les données


Message édité par daniel-12 le 06-05-2017 à 12:22:21
n°2300311
daniel-12
Posté le 06-05-2017 à 16:02:29  profilanswer
 

ton code sous excel, fonctionne juste en mettant on error resume next, juste avant la boucle for
 
la raison est qu'il y a, parfois, pas de ligne avec |
c'est les entête des extracts
 
 
Documents sélectionn.:    31.025
-----------------------------------------------------------------------------------------------------------------
|Ty.|Document                 |Vs|DPt|Gestionnaire|St|Description                             |Du        |TéSupp|
-----------------------------------------------------------------------------------------------------------------
|PLA|F000.50103               |00|000|TO00508     |VL|wings complete                          |16.06.2010|      |
|PLA|F000.50103.001           |00|000|TO00508     |VL|wings complete                          |16.06.2010|      |


Message édité par daniel-12 le 06-05-2017 à 16:04:15
n°2300313
Marc L
Posté le 06-05-2017 à 16:10:15  profilanswer
 

 
           Oui tu as raison, restons simple !
           Avec un fichier big.txt de 440 000 lignes reproduit à partir du bug.txt originel il faut moins de dix secondes :
 

Code :
  1. Sub Demo3()
  2.              Dim oTF As Object, P$, F$, T!, SP$(), S2 As String * 9, S$
  3.                    P = ThisWorkbook.Path & "\"
  4.                    F = P & "big.txt":  If Dir(F) = "" Then Beep: Exit Sub
  5.                    T = Timer
  6.    With CreateObject("Scripting.FileSystemObject" )
  7.              Set oTF = .OpenTextFile(P & "result.txt", 2, True)
  8.        With .OpenTextFile(F, 1)
  9.            Do Until .AtEndOfStream
  10.                   SP = Split(.ReadLine, "|" )
  11.              If UBound(SP) > 6 Then
  12.                   S2 = SP(2)
  13.                If S2 <> S Then
  14.                  oTF.WriteLine S2 & "%" & Replace$(SP(7), Chr$(26), "°" )
  15.                  S = S2
  16.                End If
  17.              End If
  18.            Loop
  19.                .Close
  20.        End With
  21.    End With
  22.                  oTF.Close
  23.              Set oTF = Nothing
  24.    Debug.Print "Demo3 : "; Format(Timer - T, "0.000s" )
  25. End Sub


Message édité par Marc L le 06-05-2017 à 16:24:28
n°2300321
daniel-12
Posté le 06-05-2017 à 19:11:45  profilanswer
 

Oui restons simple,  
ce dernier code fonctionne bien, et super rapide en plus
 
la détection du dernier caractère en fin de n° (15eme) comme étant un espace est suffisante
 
forcément il y a quelques n° qui sont mal écris, mais pas grave
ou des n° qui n'en sont pas
 
par exemple sur un fichier j'avais  
-149 232 ligne (traitées correctement)
-149 726 ligne (traité a la truelle, mais 5 x plus vite)
3.3% d'écart sur le 2eme traitement, mais ces lignes en trop ne sons en fait pas gênante pour ce que j'en fais ensuite
 
 

n°2300323
Marc L
Posté le 06-05-2017 à 19:17:32  profilanswer
 

 
           Là je compare juste le numéro de la ligne avec celui de la ligne précédente, c'est suffisant si le fichier est bien classé par numéro.
 
           Garde quand même dans un coin de l'esprit ADODB.Stream en cas de conversion d'encodage de caractères
           ou utile encore pour traiter des fichiers en binaire …
 

n°2300326
daniel-12
Posté le 06-05-2017 à 22:44:04  profilanswer
 

Marc L a écrit :


           Et on aimerait bien voir aussi le code original ne mettant que 45 secondes …


il devait ressembler à cela, mais sans le début qui maintenant corrige le pb de flèche=>°
J'étais donc obligé d' éditer le caractère avec notepad++ avant de lancer l'extraction
 cela prennait ensuite 45s sur un i7 47xx de mémoire

 

aujourd'hui 102s sur un i5 2540, mais avec la correction intégrée à la macro
pour 1 231 235 lignes / 138mo

 


Ta version sous Excel prend 16s  :jap:   (sur le I5 avec le fichier de 1 231 235 lignes)

 


Code :
  1. Sub VersionAllInOne2()
  2.    Dim plan As String
  3.    Dim SC As String
  4.                    TXT$ = ActiveDocument.Path & "bug.txt"  '    'fichier brut SAP
  5.             If Dir(TXT) = "" Then Beep: Exit Sub
  6.                      C$ = Chr$(26)
  7.                    
  8.        Open ActiveDocument.Path & "Bug_sans_fleche.txt" For Output As #1      'fichier corrige, sans fleche
  9.         With CreateObject("ADODB.Stream" )
  10.                      .Charset = "windows-1252"
  11.                      .Open
  12.                      .LoadFromFile TXT
  13.                    
  14.             Do Until .EOS
  15.             SC = Replace$(.ReadText(-2), C, "°" )  'string corrigée SC
  16.              Print #1, SC ' Mid(SC, 6, 88) '.ReadText(-2)
  17.             Loop
  18.                      .Close
  19.         End With
  20.         Close #1
  21.         Debug.Print "op1 : "; Format(Timer - T, "0.000s" )
  22.         Dim inputdata As String
  23.         Dim Sep As String                        'separateur
  24.        
  25.         Open ActiveDocument.Path & "Bug_sans_fleche.txt" For Input As #1
  26.         Open ActiveDocument.Path & "Bug_CORRIGE_EPURE.txt" For Output As #3
  27.         Sep = "|"
  28.        
  29.         Do While Not EOF(1)
  30.            Line Input #1, inputdata
  31.            If Mid(Fonct_1(inputdata, Sep, 3), 10, 3) = "   " Then
  32.            Print #3, Fonct_1(inputdata, Sep, 3) & Fonct_1(inputdata, Sep, 8)
  33.            End If
  34.         Loop
  35.         Close #1                            'fermeture du fichier intermédiaire
  36.         Close #3                            'fermeture du fichier FINAL
  37.      
  38.     End Sub
  39. Function Fonct_1(strStringFrom As String, strSplitcharacter As String, intExtractWordNumber As Integer) As String
  40. On Error Resume Next
  41. Fonct_1 = VBA.Split(strStringFrom, strSplitcharacter)(intExtractWordNumber - 1)
  42. If Err.Number <> 0 Then
  43.     Fonct_1 = ""
  44. End If
  45. On Error GoTo 0
  46. End Function


Message édité par daniel-12 le 06-05-2017 à 22:46:01
n°2300327
Marc L
Posté le 06-05-2017 à 22:53:10  profilanswer
 

 
           Une variante de Demo3 car certes obligé à cause de la "flèche" d'en passer par FSO pour la lecture
           mais pas du tout pour l'écriture, j'ai oublié l'interne au VBA, grattant au passage presque une seconde :
 

Code :
  1. Sub Demo4()
  2.              Dim oTF As Object, P$, F$, T!, SP$(), S2 As String * 9, S$
  3.                    P = ThisWorkbook.Path & "\"
  4.                    F = P & "big.txt":  If Dir(F) = "" Then Beep: Exit Sub
  5.                    T = Timer
  6.               Open P & "result.txt" For Output As #9
  7.    With CreateObject("Scripting.FileSystemObject" ).OpenTextFile(F, 1)
  8.        Do Until .AtEndOfStream
  9.                   SP = Split(.ReadLine, "|" )
  10.            If UBound(SP) > 6 Then
  11.                   S2 = SP(2)
  12.                If S2 <> S Then
  13.                  Print #9, S2 & "%" & Replace$(SP(7), Chr$(26), "°" )
  14.                  S = S2
  15.                End If
  16.            End If
  17.        Loop
  18.                 .Close
  19.    End With
  20.               Close
  21.               Debug.Print "Demo4 : "; Format(Timer - T, "0.000s" )
  22. End Sub

 

n°2300328
daniel-12
Posté le 06-05-2017 à 23:26:51  profilanswer
 

Merci pour ton aide !
cela m'a permis de comprendre un peu ou progresser sur les fonctions patern, ADODB, split,  
cela m'évitera maintenant d'éditer le fichier source pour enlever le caractère, chose que j'oubliai 1 fois sur 2 !
 
retranscrire ton dernier code en VBS est compliqué ?
je dis cela car l'extrac, le deplacement des fichier, le renommage, le fais tout cela avec du VBS, mais le "comprimer", je le faisais en VBA (bien plus compréhensible pour moi)

mood
Publicité
Posté le 06-05-2017 à 23:26:51  profilanswer
 

n°2300329
Marc L
Posté le 07-05-2017 à 00:09:50  profilanswer
 

 
           Comme il n'y a pas de gestion de fichier intégrée au VBScript, il faut partir non pas de Demo4 mais de Demo3 !
           Et pour tester l'existence du fichier source, la fonction Dir n'existant pas non plus en VBScript,
           utiliser la fonction FileExists de la librairie FileSystemObject …
           Rien d'autre, donc Demo3 est facile à transposer en VBScript !
 

n°2300330
daniel-12
Posté le 07-05-2017 à 00:18:11  profilanswer
 

le fichier existera forcement, car il aura juste été créé auparavant
le repertoire de sauvegarde est connu
 
je vais essayer de le faire
merci

n°2300331
Marc L
Posté le 07-05-2017 à 00:36:40  profilanswer
 

 
            Et j'ai oublié les variables forcément sans type en VBScript, donc la variable S2 doit être alimentée via la fonction Left :
 

Code :
  1.                    F = "big.txt"
  2. With CreateObject("Scripting.FileSystemObject" )
  3.    If Not .FileExists(F) Then
  4.        MsgBox "Fichier source manquant !", 48, WScript.ScriptName
  5.        WScript.Quit 1
  6.    End If
  7.              Set oTF = .OpenTextFile("result.txt", 2, True)
  8.    With .OpenTextFile(F, 1)
  9.        Do Until .AtEndOfStream
  10.                   SP = Split(.ReadLine, "|" )
  11.            If UBound(SP) > 6 Then
  12.                   S2 = Left(SP(2), 9)
  13.                If S2 <> S Then
  14.                  oTF.WriteLine S2 & "%" & Replace(SP(7), Chr(26), "°" )
  15.                  S = S2
  16.                End If
  17.            End If
  18.        Loop
  19.                 .Close
  20.    End With
  21. End With
  22.                  oTF.Close
  23.              Set oTF = Nothing
  24. MsgBox "Extraction terminée !", 64, WScript.ScriptName


Message édité par Marc L le 07-05-2017 à 12:18:42
n°2300334
daniel-12
Posté le 07-05-2017 à 12:37:30  profilanswer
 

Bien !
simple et efficace
 
If UBound(SP) > 6 Then
c'est pour tester la "largeur du tableau ?
c'est a dire que si le tableau a moins de x colonnes alors c'était une ligne ne comprenant pas de séparateurs |
c'est ça ?


Message édité par daniel-12 le 07-05-2017 à 18:05:23
n°2300335
Marc L
Posté le 07-05-2017 à 13:19:21  profilanswer
 

 
            Oui car sinon pour une ligne bidon  SP(7)  déclenche forcément une erreur #9 …
 
            Toujours éviter  On Error Resume Next  quand c'est possible pour ne pas masquer d'autres erreurs non prévues !
            Et si c'est vraiment nécessaire, parfois il suffit juste d'externaliser dans une mini procédure ou une fonction …
 

n°2300336
daniel-12
Posté le 07-05-2017 à 13:31:04  profilanswer
 

bien vu
 
pour quoi 6 ?
c'est arbitraire
 
1 a 9 marchait si j'ai bien compris le code

n°2300340
Marc L
Posté le 07-05-2017 à 15:31:48  profilanswer
 

 
            Pourtant je l'ai écrit en gras et ce n'est pas arbitraire car le plus gros indice utilisé dans le code est 7 !
 
            Sinon effectivement pour être sûr de la ligne respectant bien le format attendu, vérifier alors
            le dernier indice est bien égal à 10 comme consultable dans la fenêtre Variables locales en VBA.
            (Ou en calculant visuellement une fois la fonction Split assimilée …)
 

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Javascript - Controle d'une chaine de caractère[Java] Arrêt traitement si doublons dans champ d'un fichier
[Perl] Arrêt traitement si doublons dans champ d'un fichierproblème sur fichier launch.bat
Pb lecture mail envoyé via PHPtransformer un fichier texte en XML
recherche d'un mot dans un fichier[Regex] prenant en compte le caractère "à"
bon fichiervba-copier des colonnes d'un fichier xls vers un autre fichier xls
Plus de sujets relatifs à : Lecture fichier TXT caractère parasite ° →



Copyright © 1997-2016 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR