Bonjour à tous,
Je souhaite importer un fichier texte dans un tableur. Ce peut être Excel, LibreOffice ou OpenOffice peut importe. (je préfère LibreOffice)
Le contenu de ce fichier texte n'est pas délimité par des caractères particuliers tels que : "|" ou "," ou ";" ou des "espaces" ni des "Tab"... mais par une longueur de caractères à partir d'une position.
J'ai trouvé plusieurs messages dont l'essentiel ici :
https://www.autoitscript.fr/forum/viewtopic.php?t=3272
mais ils n'évoquent pas le même cas que le miens ;-(
J'ai essayé la fonction : _Excel_BookOpenText
mais le descriptif du paramètre $aFieldInfo semble incomplet (aussi bien en français qu'en anglais).
"L'interprétation dépend de la valeur de DataType." OK je suis à $iDataType=2 soit xlFixedWidth
"Lorsque les données sont délimitées, cet argument est un tableau à deux éléments..." ce qui n'est pas mon cas car je suis en délimité mais il n'y a pas la description de l'autre cas...
PS : Je ne veux pas passer par le menu d'import csv d'Excel ou autre car il me faut environ 30min pour délimiter les colonnes...
exemple très court de fichier texte : (sachant qu'il y a + 600 caractères par ligne et + de 25000 lignes)
0000000001500111236
1234567891600112598
9876543215700112597
mon souhait
colonne A du 1ier caractère au 3ième (000, 123, 987)
colonne B du 11ième au 13ième (500, 600, 700)
ect
Je suis preneur de toute piste !
Par avance je vous remercie,
Tib
[R] Import fichier texte sous Excel
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
[R] Import fichier texte sous Excel
Modifié en dernier par TiBroom le mer. 05 avr. 2017 20:49, modifié 1 fois.
-
- Niveau 3
- Messages : 47
- Enregistré le : lun. 07 mars 2016 07:20
- Status : Hors ligne
Re: [..] Import fichier texte sous Excel
Bonsoir,
la première question que l'on peut se poser, est si ce fichier texte est toujours strcturé de la même manière. Si c'est le cas, alors tu peux utiliser la fonction _stringinsert qui te permettra d’insérer le caractère propre au CSV (";") ou celui que tu veux pour écrire le fichier.csv ou importer directement le découpage dans une array, une fois fait, le travail est aisé avec l'UDF OOoCalc.au3 qui te permetra d'envoyer le tout dans un fichier calc
sans aller aussi loin, j'ai juste le début pour lire le fichier texte et l'ecrire en fichier CSV (si la structure du fichier ne bouge pas)
la première question que l'on peut se poser, est si ce fichier texte est toujours strcturé de la même manière. Si c'est le cas, alors tu peux utiliser la fonction _stringinsert qui te permettra d’insérer le caractère propre au CSV (";") ou celui que tu veux pour écrire le fichier.csv ou importer directement le découpage dans une array, une fois fait, le travail est aisé avec l'UDF OOoCalc.au3 qui te permetra d'envoyer le tout dans un fichier calc
sans aller aussi loin, j'ai juste le début pour lire le fichier texte et l'ecrire en fichier CSV (si la structure du fichier ne bouge pas)
#include<File.au3>
#include <String.au3>
$file=@ScriptDir & "\text.txt" ; le fichier contenant ton texte a transformer
$read = FileRead($file) ; lecture
$line = StringSplit($read, @CR) ; coupage au saut de ligne
$csv = @scriptdir & "\filecsv.csv" ; ecriture d'un fichier de sortie (pas forcement nécessaire ici)
For $i = 1 To $line[0] ; pour i allant de 1 a la fin du fichier texte
$var = FileReadLine($file, $i) ; lecture de chaque ligne
$var=_StringInsert ( $var,";",3 ) ; insertion d'un caractère a la place voulue
$var=_StringInsert ( $var,";",11 ) ; a répéter autant de fois que nécessaire
$var=_StringInsert ( $var,";",15 )
filewrite($csv,$var & @CR) ; ecriture du fichier de sortie en n'oubliant pas de remettre un charriot en fin de course
Next
#include <String.au3>
$file=@ScriptDir & "\text.txt" ; le fichier contenant ton texte a transformer
$read = FileRead($file) ; lecture
$line = StringSplit($read, @CR) ; coupage au saut de ligne
$csv = @scriptdir & "\filecsv.csv" ; ecriture d'un fichier de sortie (pas forcement nécessaire ici)
For $i = 1 To $line[0] ; pour i allant de 1 a la fin du fichier texte
$var = FileReadLine($file, $i) ; lecture de chaque ligne
$var=_StringInsert ( $var,";",3 ) ; insertion d'un caractère a la place voulue
$var=_StringInsert ( $var,";",11 ) ; a répéter autant de fois que nécessaire
$var=_StringInsert ( $var,";",15 )
filewrite($csv,$var & @CR) ; ecriture du fichier de sortie en n'oubliant pas de remettre un charriot en fin de course
Next
Re: [..] Import fichier texte sous Excel
Bonjour à tous,
Merci de votre réponse.
J'ai apporté quelques modifications :
1- L'insertion d'un caractère à une position voulue devient incohérente... Découverte d'un décalage croissant dans le comptage des caractères lors de l'utilisation de _StringInsert -> utilisation du compteur $n
2- Quantité importante de caractères à insérer me concernant (>70), la flemme de les compter pour déclarer le tableau correctement et envie de souplesse si besoin de l'adapter pour faire autre chose -> $tab
3- Il semblerait que l'include Array.au3 ne soit pas nécessaire mais... j'ai un doute
N'hésitez pas à me conseiller sur le code.
TiB
Merci de votre réponse.
J'ai apporté quelques modifications :
1- L'insertion d'un caractère à une position voulue devient incohérente... Découverte d'un décalage croissant dans le comptage des caractères lors de l'utilisation de _StringInsert -> utilisation du compteur $n
2- Quantité importante de caractères à insérer me concernant (>70), la flemme de les compter pour déclarer le tableau correctement et envie de souplesse si besoin de l'adapter pour faire autre chose -> $tab
3- Il semblerait que l'include Array.au3 ne soit pas nécessaire mais... j'ai un doute
N'hésitez pas à me conseiller sur le code.
TiB
#include <File.au3>
#include <String.au3>
#include <Array.au3>
$file=@ScriptDir & "\test.txt" ; le fichier contenant ton texte à transformer
$read = FileRead($file) ; lecture
$line = StringSplit($read, @CR) ; coupage au saut de ligne
$csv = @scriptdir & "\test.csv" ; ecriture d'un fichier de sortie (pas forcement nécessaire ici)
Local $iData= " 4, 11, 14"
Local $iMax ; Nombre de colonnes du futur tableau déterminé par $iData (moins la colonne 0)
Local $iArr = StringSplit($iData, ",")
$iMax = UBound($iArr) - 1
Dim $tab[1]
$j = 1 ; Premier élément de $iData incrémenté de +1 pour passer à l'élément suivant
For $i = 1 To $iMax
_ArrayAdd ( $tab, $iArr[$j] )
$j = $j + 1
Next
;~ _ArrayDisplay( $tab, "RESUL")
Local $m = 1 ; Compteur pour se déplacer dans Array
Local $n = -1 ; Compteur de décallage à chaque insertion du caractère spécial
For $k = 1 To $line[0] ; pour k allant de 1 à la fin du fichier texte
$var = FileReadLine($file, $k) ; lecture de chaque ligne
For $l = 1 To $iMax
$var=_StringInsert ( $var,";",$tab[$m]+$n )
$m = $m +1
$n = $n +1
Next
filewrite($csv,$var & @CR) ; ecriture du fichier de sortie en n'oubliant pas de remettre un charriot en fin de course
$m = 1 ; RAZ Compteur
$n = -1 ; RAZ Compteur
Next
#include <String.au3>
#include <Array.au3>
$file=@ScriptDir & "\test.txt" ; le fichier contenant ton texte à transformer
$read = FileRead($file) ; lecture
$line = StringSplit($read, @CR) ; coupage au saut de ligne
$csv = @scriptdir & "\test.csv" ; ecriture d'un fichier de sortie (pas forcement nécessaire ici)
Local $iData= " 4, 11, 14"
Local $iMax ; Nombre de colonnes du futur tableau déterminé par $iData (moins la colonne 0)
Local $iArr = StringSplit($iData, ",")
$iMax = UBound($iArr) - 1
Dim $tab[1]
$j = 1 ; Premier élément de $iData incrémenté de +1 pour passer à l'élément suivant
For $i = 1 To $iMax
_ArrayAdd ( $tab, $iArr[$j] )
$j = $j + 1
Next
;~ _ArrayDisplay( $tab, "RESUL")
Local $m = 1 ; Compteur pour se déplacer dans Array
Local $n = -1 ; Compteur de décallage à chaque insertion du caractère spécial
For $k = 1 To $line[0] ; pour k allant de 1 à la fin du fichier texte
$var = FileReadLine($file, $k) ; lecture de chaque ligne
For $l = 1 To $iMax
$var=_StringInsert ( $var,";",$tab[$m]+$n )
$m = $m +1
$n = $n +1
Next
filewrite($csv,$var & @CR) ; ecriture du fichier de sortie en n'oubliant pas de remettre un charriot en fin de course
$m = 1 ; RAZ Compteur
$n = -1 ; RAZ Compteur
Next
- orax
- Modérateur
- Messages : 1479
- Enregistré le : lun. 23 mars 2009 04:50
- Localisation : ::1
- Status : Hors ligne
Re: [..] Import fichier texte sous Excel
L'include Array.au3 est nécessaire puisqu'il y a _ArrayAdd.
Il y a plusieurs accès au fichier test.txt donc ça sera un peu plus optimisé si un handle est ouvert avec FileOpen.
Il n'y a pas besoin d'indiquer le numéro de la ligne. FileReadLine peut lire chaque ligne jusqu'à la fin du fichier.
J'en profite pour proposer une autre solution qui utilise les expressions régulières.
Il y a plusieurs accès au fichier test.txt donc ça sera un peu plus optimisé si un handle est ouvert avec FileOpen.
Il n'y a pas besoin d'indiquer le numéro de la ligne. FileReadLine peut lire chaque ligne jusqu'à la fin du fichier.
#include <File.au3>
#include <String.au3>
#include <Array.au3>
$file = @ScriptDir & "\test.txt" ; le fichier contenant ton texte à transformer
$csv = @ScriptDir & "\test.csv" ; ecriture d'un fichier de sortie (pas forcement nécessaire ici)
Local $iData = " 4, 11, 14"
Local $iMax ; Nombre de colonnes du futur tableau déterminé par $iData (moins la colonne 0)
Local $iArr = StringSplit($iData, ",")
$iMax = UBound($iArr) - 1
Dim $tab[1]
$j = 1 ; Premier élément de $iData incrémenté de +1 pour passer à l'élément suivant
For $i = 1 To $iMax
_ArrayAdd($tab, $iArr[$j])
$j = $j + 1
Next
;~ _ArrayDisplay( $tab, "RESUL")
Local $m = 1 ; Compteur pour se déplacer dans Array
Local $n = -1 ; Compteur de décallage à chaque insertion du caractère spécial
$hFile = FileOpen($file) ; ouvre un handle en lecture
If $hFile = -1 Then Exit 1
$hCsv = FileOpen($csv, $FO_OVERWRITE) ; ouvre un handle en écriture ; le contenu du fichier sera effacé
If $hCsv = -1 Then Exit 1
While 1
$var = FileReadLine($hFile) ; lecture de chaque ligne
If @error Then ExitLoop ; s'il y a une erreur ou si c'est la fin du fichier
For $i = 1 To $iMax
$var = _StringInsert($var, ";", $tab[$m] + $n)
$m = $m + 1
$n = $n + 1
Next
FileWriteLine($hCsv, $var) ; ecriture du fichier de sortie
$m = 1 ; RAZ Compteur
$n = -1 ; RAZ Compteur
WEnd
; ferme les handles
FileClose($file)
FileClose($hCsv)
#include <String.au3>
#include <Array.au3>
$file = @ScriptDir & "\test.txt" ; le fichier contenant ton texte à transformer
$csv = @ScriptDir & "\test.csv" ; ecriture d'un fichier de sortie (pas forcement nécessaire ici)
Local $iData = " 4, 11, 14"
Local $iMax ; Nombre de colonnes du futur tableau déterminé par $iData (moins la colonne 0)
Local $iArr = StringSplit($iData, ",")
$iMax = UBound($iArr) - 1
Dim $tab[1]
$j = 1 ; Premier élément de $iData incrémenté de +1 pour passer à l'élément suivant
For $i = 1 To $iMax
_ArrayAdd($tab, $iArr[$j])
$j = $j + 1
Next
;~ _ArrayDisplay( $tab, "RESUL")
Local $m = 1 ; Compteur pour se déplacer dans Array
Local $n = -1 ; Compteur de décallage à chaque insertion du caractère spécial
$hFile = FileOpen($file) ; ouvre un handle en lecture
If $hFile = -1 Then Exit 1
$hCsv = FileOpen($csv, $FO_OVERWRITE) ; ouvre un handle en écriture ; le contenu du fichier sera effacé
If $hCsv = -1 Then Exit 1
While 1
$var = FileReadLine($hFile) ; lecture de chaque ligne
If @error Then ExitLoop ; s'il y a une erreur ou si c'est la fin du fichier
For $i = 1 To $iMax
$var = _StringInsert($var, ";", $tab[$m] + $n)
$m = $m + 1
$n = $n + 1
Next
FileWriteLine($hCsv, $var) ; ecriture du fichier de sortie
$m = 1 ; RAZ Compteur
$n = -1 ; RAZ Compteur
WEnd
; ferme les handles
FileClose($file)
FileClose($hCsv)
Code : Tout sélectionner
Résultat :
000;0000001;500;111236
123;4567891;600;112598
987;6543215;700;112597
J'en profite pour proposer une autre solution qui utilise les expressions régulières.
#include <File.au3>
$file = @ScriptDir & "\test.txt" ; le fichier contenant ton texte à transformer
$csv = @ScriptDir & "\test.csv" ; ecriture d'un fichier de sortie (pas forcement nécessaire ici)
$str = StringRegExpReplace(FileRead($file), "(?m)^(\d{3})\d{7}(\d{3})\d+", "\1;\2")
$hCsv = FileOpen($csv, $FO_OVERWRITE) ; ouvre un handle en écriture ; le contenu du fichier sera effacé
If $hCsv = -1 Then Exit 1
FileWrite($hCsv, $str)
FileClose($hCsv)
$file = @ScriptDir & "\test.txt" ; le fichier contenant ton texte à transformer
$csv = @ScriptDir & "\test.csv" ; ecriture d'un fichier de sortie (pas forcement nécessaire ici)
$str = StringRegExpReplace(FileRead($file), "(?m)^(\d{3})\d{7}(\d{3})\d+", "\1;\2")
$hCsv = FileOpen($csv, $FO_OVERWRITE) ; ouvre un handle en écriture ; le contenu du fichier sera effacé
If $hCsv = -1 Then Exit 1
FileWrite($hCsv, $str)
FileClose($hCsv)
Code : Tout sélectionner
Résultat :
000,500
123,600
987,700
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Re: [..] Import fichier texte sous Excel
Bonsoir à tous,
Merci à tous pour ces commentaires.
Pour information mon code met 25min de traitement ; celui modifié par Orax (avec FileOpen) met 20s. Oui oui vous avez bien lu, je ne me suis pas trompé dans les unités de mesure !
La curiosité me ferra découvrir les expressions régulières... mais pas dans l'immédiat.
TiB
Merci à tous pour ces commentaires.
Pour information mon code met 25min de traitement ; celui modifié par Orax (avec FileOpen) met 20s. Oui oui vous avez bien lu, je ne me suis pas trompé dans les unités de mesure !
La curiosité me ferra découvrir les expressions régulières... mais pas dans l'immédiat.
TiB