[R] Import fichier texte sous Excel

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
TiBroom
Niveau 1
Niveau 1
Messages : 8
Enregistré le : sam. 25 mars 2017 13:45
Status : Hors ligne

[R] Import fichier texte sous Excel

#1

Message par TiBroom »

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
Modifié en dernier par TiBroom le mer. 05 avr. 2017 20:49, modifié 1 fois.
marcgforce
Niveau 3
Niveau 3
Messages : 47
Enregistré le : lun. 07 mars 2016 07:20
Status : Hors ligne

Re: [..] Import fichier texte sous Excel

#2

Message par marcgforce »

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)
#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
TiBroom
Niveau 1
Niveau 1
Messages : 8
Enregistré le : sam. 25 mars 2017 13:45
Status : Hors ligne

Re: [..] Import fichier texte sous Excel

#3

Message par TiBroom »

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
    #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
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Import fichier texte sous Excel  

#4

Message par orax »

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.
#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)

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)

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)
TiBroom
Niveau 1
Niveau 1
Messages : 8
Enregistré le : sam. 25 mars 2017 13:45
Status : Hors ligne

Re: [..] Import fichier texte sous Excel

#5

Message par TiBroom »

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
Répondre