Écrire à une ligne précise d'un fichier

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Wiltech
Niveau 3
Niveau 3
Messages : 33
Enregistré le : ven. 02 juin 2017 14:50
Localisation : Tours
Status : Hors ligne

Écrire à une ligne précise d'un fichier  

#1

Message par Wiltech » mer. 29 mai 2019 14:23

Bonjour, voici mon problème mon script récupéré des informations de l'ordinateur après cela il met toutes les informations dans un fichier csv et un fichier json, mon problème et lords de la modification de mon fichier json je voudrais que si le fichier a déjà été créé il écrive à la suite tout en étant avant le ] de la fin.

Mon _FileWriteToLine ne marche pas le fichier reste intacte que faire ?

Voici mon code :

Code : Tout sélectionner

#Region : Création d'un fichier au format JSON
;Vérifie si un dossier du nom de JSON existe, si ce n'est pas le cas il le crée
If Not FileExists("JSON") Then
	DirCreate("JSON")
Endif


If Not FileExists("JSON\InfoOrdi.json") Then
	;Création et ouverture du fichier InfoOrdi.json
	$json = FileOpen(@ScriptDir & "\JSON\InfoOrdi.json", 1)
	;Création d'un tableau où l'on insère les éléments obtenus précédemment au format json
	Dim $tableau_info[9]=['[','{','"Nom_PC" : "' & @ComputerName & '",','"UUID" : "' & $uuid & '",','"Taille_Disk" : "' & $sizeDisk & '",','"RAM" : "' & $ssd & '",','"Eligible" : "' & $eligible & '"','}',']']
	;Parcours du tableau pour ajouter chaque ligne du tableau dans le fichier InfoOrdi.json
	For $i = 0 To Ubound($tableau_info) - 1
		FileWrite($json, $tableau_info[$i] & @LF)
	Next
	;Fermeture du fichier InfoOrdi.json
	FileClose($json)
Else
	;Ouverture du fichier InfoOrdi.json
	$json = FileOpen(@ScriptDir & "\JSON\InfoOrdi.json", 1)
	;Création d'un tableau où l'on insère les éléments obtenus précédemment au format json
	Dim $tableau_add[7]=['{','"Nom_PC" : "' & @ComputerName & '",','"UUID" : "' & $uuid & '",','"Taille_Disk" : "' & $sizeDisk & '",','"RAM" : "' & $ssd & '",','"Eligible" : "' & $eligible & '"',"}"]
	$nbLigne = 1
	;Parcours du tableau pour ajouter chaque ligne du tableau dans le fichier InfoOrdi.json
	For $j = 0 To Ubound($tableau_add) - 1
		$read =  FileReadLine($json,$nbLigne)
		_FileWriteToLine($json,1,$read&$tableau_add[$j]&@LF, False)
		$nbLigne = $nbLigne + 1
	Next
	;Fermeture du fichier InfoOrdi.json
	FileClose($json)
EndIf


#EndRegion
Modifié en dernier par Wiltech le mer. 29 mai 2019 15:00, modifié 1 fois.

Avatar du membre
Wiltech
Niveau 3
Niveau 3
Messages : 33
Enregistré le : ven. 02 juin 2017 14:50
Localisation : Tours
Status : Hors ligne

Écrire à une ligne précise d'un fichier

#2

Message par Wiltech » mer. 29 mai 2019 14:59

Désoler pour le dérangement j'ai enfin résolut mon problème il fallait encore indiquer l'emplacement de mon fichier
Voila le code pour ce qui en aurais besoin :

Code : Tout sélectionner

#include <File.au3>
;Vérifie si un dossier du nom de JSON existe, si ce n'est pas le cas il le crée
If Not FileExists("JSON") Then
	DirCreate("JSON")
Endif

$emplacement = @ScriptDir & "\JSON\InfoOrdi.json"

If Not FileExists("JSON\InfoOrdi.json") Then
	;Création et ouverture du fichier InfoOrdi.json
	$json = FileOpen(@ScriptDir & "\JSON\InfoOrdi.json", 1)
	;Création d'un tableau où l'on insère les éléments obtenus précédemment au format json
	Dim $tableau_info[9]=['[','{','"Nom_PC" : "' & @ComputerName & '",','"UUID" : "' & $uuid & '",','"Taille_Disk" : "' & $sizeDisk & '",','"RAM" : "' & $ssd & '",','"Eligible" : "' & $eligible & '"','}',']']
	;Parcours du tableau pour ajouter chaque ligne du tableau dans le fichier InfoOrdi.json
	For $i = 0 To Ubound($tableau_info) - 1
		FileWrite($json, $tableau_info[$i] & @LF)
	Next
	;Fermeture du fichier InfoOrdi.json
	FileClose($json)
Else
	;Ouverture du fichier InfoOrdi.json
	$json = FileOpen(@ScriptDir & "\JSON\InfoOrdi.json", 1)
	;Création d'un tableau où l'on insère les éléments obtenus précédemment au format json
	Dim $tableau_add[8]=[',','{','"Nom_PC" : "' & @ComputerName & '",','"UUID" : "' & $uuid & '",','"Taille_Disk" : "' & $sizeDisk & '",','"RAM" : "' & $ssd & '",','"Eligible" : "' & $eligible & '"',"}"]
	$nbLigne = _FileCountLines($emplacement)
	$nbLigne = $nbLigne -1
	;Parcours du tableau pour ajouter chaque ligne du tableau dans le fichier InfoOrdi.json
	For $j = 0 To Ubound($tableau_add) - 1
		$read =  FileReadLine($emplacement,$nbLigne)
		_FileWriteToLine($emplacement,$nbLigne,$read&$tableau_add[$j]&@LF, False)
		$nbLigne = $nbLigne + 1
	Next
	;Fermeture du fichier InfoOrdi.json
	FileClose($json)
EndIf

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11382
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: Écrire à une ligne précise d'un fichier

#3

Message par Tlem » jeu. 30 mai 2019 00:51

Bonsoir Wiltech.

Au delà du fait que votre code ne fonctionne pas correctement (un } en trop à la fin + des lignes vides), votre script contient quelques incohérences.
Vous déclarez la variable $emplacement qui correspond au chemin + nom de fichier, mais ne l'utilisez pas dans le test de présence du fichier et les FileOpen ...
Vous testez la présence du dossier pour le créer, alors qu'un FileOpen avec le flag $FO_CREATEPATH (8) fait la même chose, de plus, vous déclarez deux fois le tableau alors qu'une seule fois suffit. :roll:

Voici un code différent, mais qui fonctionne.

Code : Tout sélectionner

Local $uuid = "UUID"
Local $sizeDisk = "SIZEDISK"
Local $ssd = "SSD"
local $eligible = "ELIGIBLE"

; Déclaration des variables du chemin de fichier et des données mises en forme.
Local $FileJSON = @ScriptDir & "\JSON\InfoOrdi.json"
Local $Data = '{' & @CRLF & '"Nom_PC" : "' & @ComputerName & '",' & @CRLF & '"UUID" : "' & $uuid & '",' & @CRLF &'"Taille_Disk" : "' & _
			  $sizeDisk & '",' & @CRLF & '"RAM" : "' & $ssd & '",' & @CRLF & '"Eligible" : "' & $eligible & '"' & @CRLF & '}'

If Not FileExists($FileJSON) Then
	; Création et ouverture du fichier InfoOrdi.json
	$json = FileOpen($FileJSON, 2 + 8)

	; Ecriture du fichier json
	FileWrite($json,'[' & @CRLF & $Data & @CRLF & ']' & @CRLF)
Else
	; Lecture du fichier
	$sFile = FileRead($FileJSON)

	; Recherche de l'emplacement des caractères } suivi d'un CRLF suivi d'un ]
	$Count = StringInStr($sFile, "}" & @CRLF & "]")
	; Nettoyage de la fin du fichier pour supprimer } avec ]
	$sFile = StringTrimRight($sFile, StringLen($sFile) - $Count + 1)

	; Ouverture du fichier InfoOrdi.json pour remplacement du texte
	$json = FileOpen($FileJSON, 2)

	; Ecriture des nouvelles données mises en forme.
	FileWrite($FileJSON, $sFile & "}," & @CRLF & $Data & @CRLF & "]")
EndIf

; Fermeture du fichier InfoOrdi.json
FileClose($json)
Si vous êtes absolument sur que votre fichier json ne contiendra pas de LF ou CRLF en fin de fichier, vous pouvez remplacer :

Code : Tout sélectionner

	; Recherche de l'emplacement des caractères } suivi d'un CRLF suivi d'un ]
	$Count = StringInStr($sFile, "}" & @CRLF & "]")
	; Nettoyage de la fin du fichier pour supprimer } avec ]
	$sFile = StringTrimRight($sFile, StringLen($sFile) - $Count + 1)
Par

Code : Tout sélectionner

	; Nettoyage de la fin du fichier pour supprimer } avec ]
	$sFile = StringTrimRight($sFile, StringLen($sFile) - 4)
Enfin, si l'expression régulière ne vous fait pas peur, il y a aussi ce type de code que je trouve plus adapté et assez polyvalent :

Code : Tout sélectionner

Local $uuid = "UUID"
Local $sizeDisk = "SIZEDISK"
Local $ssd = "SSD"
local $eligible = "ELIGIBLE"

; Déclaration des variables du chemin de fichier et des données mises en forme.
Local $FileJSON = @ScriptDir & "\JSON\InfoOrdi.json"
Local $Data = '{' & @CRLF & '"Nom_PC" : "' & @ComputerName & '",' & @CRLF & '"UUID" : "' & $uuid & '",' & @CRLF &'"Taille_Disk" : "' & _
			  $sizeDisk & '",' & @CRLF & '"RAM" : "' & $ssd & '",' & @CRLF & '"Eligible" : "' & $eligible & '"' & @CRLF & '}'

If Not FileExists($FileJSON) Then
	; Création et ouverture du fichier InfoOrdi.json
	$json = FileOpen($FileJSON, 2 + 8)

	; Ecriture du fichier json
	FileWrite($json,'[' & @CRLF & $Data & @CRLF & ']' & @CRLF)
Else
	; Remplace la séquence de caractères } suivi d'un CRLF suivi d'un ] par les nouvelles données encadrées des balises
	$sFile = StringRegExpReplace(FileRead($FileJSON), '}\r\n]*', "}," & @CRLF & $Data & @CRLF & "]")

	; Ouverture du fichier InfoOrdi.json pour remplacement du texte
	$json = FileOpen($FileJSON, 2)

	; Ecriture des nouvelles données mises en forme.
	FileWrite($FileJSON, $sFile)
EndIf

; Fermeture du fichier InfoOrdi.json
FileClose($json)
Je ne doute pas que certains cadors de l'expression régulière améliorerons le motif de l'expression régulière afin de prendre en compte les différentes possibilités du retour à la ligne entre } et ] qui peuvent être un simple LF ou un CRLF. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Répondre