EFFACER UNE LIGNE DANS UN FICHIER TXT

Messages postés
12
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
24 mai 2006
- - Dernière réponse : BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
- 8 juin 2006 à 17:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/37645-effacer-une-ligne-dans-un-fichier-txt

Afficher la suite 
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
Précision:
nroline est en fait un DWORD donc plage de 32 bits full, en VB aucune idée si est possible.
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
http://bnmvp.free.fr/RemLine.zip
Il y a la dll (3 Ko) et prog de test (tout en C...).
Le numéro de ligne est BASE 0 !!!
Le fichier est traité sur place sans utiliser de tmp, 256 Ko de mémoire (et rien d'autre) pendant le traitement.
Suppression de ligne sur txt de 1,6 Go en 1mn10, à voir selon PC.
Utilisation de la DLL depuis VB:
Declare Function bnRemLine Lib "bnLine.dll" (ByVal szFile As String, ByVal nroline As Long) As Long
Retourne
- 0 : NO ERROR
- -1: FICHIER NON DISPO OU SIZE > 2^63
- 1 : ERR MEMORY
- 2 : ERR SYSTEM (GetFileSize, ReadFile ou WriteFile)
Fichier doit être fermé, dll prend un accès exclusif dessus.
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
OneHacker, pour revenir au sujet, 5 mn c'est pour supprimer une ligne très loin du début je pense.
Je peaufine et fais encore qlqs tests sur une dll et je vous la file ensuite, elle vient de supprimer la ligne 19800 en qlqs centièmes de seconde. J'essaie illico sur beaucoup plus gros, on verra.
TroXsA
Messages postés
553
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
2 octobre 2016
-
Perso !
je vous rappel qu'il existe un forum pour ce genre de dicussion ! car plus sa va plus ça n'a rien a voir avec le code source donné :/
jsem2k1
Messages postés
125
Date d'inscription
samedi 11 décembre 2004
Statut
Membre
Dernière intervention
12 août 2008
1 -
tien essay sa j'ai tester er sa marche
Imports System.Runtime.InteropServices
<DllImport("user.DLL", EntryPoint:="SendMessageA", SetLastError:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function SendMessageA( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As String) As Long
' Leave the body of the function empty.
End Function
vas aussi voir se site (http://msdn2.microsoft.com/fr-fr/library/5k8a3s7s.aspx) pour migré l'appelle des api
le type any n'est plus pris en compte
ratala
Messages postés
248
Date d'inscription
jeudi 3 février 2005
Statut
Membre
Dernière intervention
22 juin 2008
-
il me dit : "Instruction non valide dans un espace de noms"
t'a pas une autre solution ?
jsem2k1
Messages postés
125
Date d'inscription
samedi 11 décembre 2004
Statut
Membre
Dernière intervention
12 août 2008
1 -
dsl je me suis tromper c'est Private Declare Auto Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long

c'est ce qui arrive quand on fait vite les chose
ratala
Messages postés
248
Date d'inscription
jeudi 3 février 2005
Statut
Membre
Dernière intervention
22 juin 2008
-
Merci mais il me dit : Fin d'instruction attendue
qu'est que je peux faire ?
jsem2k1
Messages postés
125
Date d'inscription
samedi 11 décembre 2004
Statut
Membre
Dernière intervention
12 août 2008
1 -
Private Auto Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
ratala
Messages postés
248
Date d'inscription
jeudi 3 février 2005
Statut
Membre
Dernière intervention
22 juin 2008
-
Salut,
Quelqun pourrait me dire comment transformer cette declaration d'api vb6 en déclaration d'api .net ?
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
OneHacker
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
1 -
De plus j'ai testé tout à l'heure avec un texte de 3GO ca rame mais ca met 5 minutes c'est tout.
TroXsA
Messages postés
553
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
2 octobre 2016
-
J'suis du meme avis que OneHacker !
puis lire un fichier de 1 Go ne pause pas de probleme quand on utilise 'Queue' lecture de l'item et destruction pour ne pas faire un auto denial of service lol
il me semble qu'il existe de multiple choix pour effacé une ligne dans un fichier ... tout depand quel est le type de fichier a lire, c'est sur que lire un fichier qui fait 50 Ko n'est pas la meme chose qu'un fichier qui fait 5 Go ...

@+
www.troxsa.info
OneHacker
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
1 -
Normal on va pas travailler sur des textes énormes !
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
Une fonction se doit de tourner à tout coup, essaie sur un fichier de 1 Go et tu verras de suite que ce sera l'injurebox "manque de mémoire".
Question vitesse de traitement, une horreur.
OneHacker
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
1 -
Mais tout simplement en une fonction !

par ex :

Function NewText(ByVal Text As String, ByVal IndexLine As Integer)
' IndexLine et l'index de la ligne à supprimer
Dim result As String = Text ' Valeur à renvoyer

For Each line As String In result.Split(NewLine)
If result.Split(NewLine).IndexOf(result.Split(NewLine), line) = IndexLine Then
result.Replace(line, "")
End If
Next

Return result
End Function
jsem2k1
Messages postés
125
Date d'inscription
samedi 11 décembre 2004
Statut
Membre
Dernière intervention
12 août 2008
1 -
Wao Merci mec tu vient de m'apprande une chose vraiment utile la et dire que j'étais rester dans l'iniorance tout ce tant. heheh C'est géniale ton truc et rapide en plus

Je retire ce que j'ai dit plus haut hehe

Merci pour ton savoir BrunNews
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
Sur de grandes masses de données, le problème ne doit se poser en aucun cas car il convient d'appeler du code natif et lui refiler le boulot, aucun interprété ne convient pour l'analyse de fichier important.
Regarde ici pour t'en convaincre:
http://www.cppfrance.com/code.aspx?id=19169
ou: http://www.cppfrance.com/code.aspx?ID=31892
jsem2k1
Messages postés
125
Date d'inscription
samedi 11 décembre 2004
Statut
Membre
Dernière intervention
12 août 2008
1 -
BruNews le problème c'est pas tant le fait de metre sa dans un vecteur et de garder le tout en mémoire. si ce n'étais que sa t'aurais trouver la solution magique. Le problème qui se pose c'est qu'il est impossible ( du moins je crois) de facon syncrone d'écrire et de lire en plein milieux d'un ficher texte. Imagine que tu veux modifier une ligne selon certain critaire. Avec un fichier syncrone tu es obliger de parcourire le fichier au complet ( du moins ligne par ligne). imagine que ce que tu veux trouver se trouve a la dernière ligne du fichier et que tu ne le sais pas et qu'il y a plus de 1 000 lignes de 600 caractère chacune.... t'est fait. Vas te chercher un café et soit patiant. Si tu veux juste récupéré une ligne en particulier ce n'est pas si pire car tu peux réussire a bien t'en sortir si ton ficher est ordonner mais obli sa si ton fichier ne l'est pas. C'est pour sa qu'un acces asyncrone sur des fichier est toujours apréciet mais pour sa il faut que le fichier soit bien ordonner et que tu connaisse la structure de ton ficher.

Ta solution est donc peux pratique en se sence la. Mais de toute facon ce n'est pas trop professionelle que de créé des double de fichier comme sa. Si ton aplis dou géré une grande quantité de fichier de grande taille avec des resource limité c'est pas la joi

Mais j'avoue que ta solution a incontestablement ces avantage
cs_volnay
Messages postés
12
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
24 mai 2006
-
ok Brunews mais de toutes façons tu es obligé de faire un truc séquentiel qui passe en revue toutes les lignes du fichier meme si tu dois insérer du texte à la 2eme ligne. c'est vrai ta methode evite de passer par un tableau.
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
Pourquoi pas d'autre solution ???
Au lieu de mettre dans un tableau, on écrit les lignes qu'on veut garder direct dans un second fichier, quand fini on ferme les 2, on supprime l'original et on renomme le 2eme du nom du 1er. Sera + rapide et quasi rien en conso mémoire sinon sera impossible sur gros fichiers.

Ensuite c'est comme d'hab, si on veut du vraiment rapide, on écrit la routine en C dans un dll et on l'appelle quand besoin, sera absolument incomparable en perfs.
jsem2k1
Messages postés
125
Date d'inscription
samedi 11 décembre 2004
Statut
Membre
Dernière intervention
12 août 2008
1 -
En effet les fichier texte son en déclain mais il y a toujours les xml c'est magique comme type de ficher et de plus les classe xml son dirrectement parti du framework. Il sont une partie importante de DotNet. Pas étonant c'est magique ce truc la.

Mais bon pour revenir a ta procédure sa va prendre une éternité et bouffé beaucoup de resource système s'il y a des milier de ligne. Mais de toute facon si on a un aussi gros fichier texte c'est surement parce qu'on utilise un éditeur de texte.
drakins
Messages postés
4
Date d'inscription
mercredi 17 mai 2006
Statut
Membre
Dernière intervention
14 juin 2013
-
Salut Volnay,
Oui je pense que ca doit prendre du temps avec des milliers de lignes, mais pour le moment (j'ai beauçoup chercher aussi) il n'y a pas d'autre solution.Et je serais étonner qu'il y'en a une autre un jour, avec les BDD qui sont bien plus pratique que les fichier txt.
cs_volnay
Messages postés
12
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
24 mai 2006
-
Salut Drakins,
J'ai été confronté récemment à ce problème d'insertion ou suppression de ligne dans un fichier texte et j'ai été surpris de voir qu'il n'existait rien de vraiment spécial dans le framework (a priori) qu'une des solutions était de tout recopier le ficher txt dans un tableau. Mais bon ça doit vraiment être lent avec un fichier de plusieurs milliers de ligne
cs_et1
Messages postés
250
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
27 janvier 2011
7 -
Pour compiler avec Sharpdevelop :

Exécution > Compilé
drakins
Messages postés
4
Date d'inscription
mercredi 17 mai 2006
Statut
Membre
Dernière intervention
14 juin 2013
-
Bonjour Volnay,

J'ai fait des tests avec cette methode sur des fichiers de 30 lignes seulement pour le moment. Pour les temps de réponse, je ne sais pas. Comme je ne développe que de petite application, je ne mis suis jamais intéresser.
ratala
Messages postés
248
Date d'inscription
jeudi 3 février 2005
Statut
Membre
Dernière intervention
22 juin 2008
-
Quelqun pourrait me dire comment on compile en .exe avec Sharpdevelop svp ?
cs_clementpat
Messages postés
406
Date d'inscription
lundi 2 décembre 2002
Statut
Membre
Dernière intervention
25 janvier 2014
-
Salut j'ai les 2 VB et VB net

vb net pas terrible pour la distribution d'application
ratala
Messages postés
248
Date d'inscription
jeudi 3 février 2005
Statut
Membre
Dernière intervention
22 juin 2008
-
Tu sais pas ou je pourrai trouver Dotnet framework 2.0 ?
ratala
Messages postés
248
Date d'inscription
jeudi 3 février 2005
Statut
Membre
Dernière intervention
22 juin 2008
-
Genial !
cs_et1
Messages postés
250
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
27 janvier 2011
7 -
Bonjour,
vive la question...lol évidemment que oui.
Pour programmer en vb.net si tu n'as pas Microsoft Visual Basic .net, voici un compilateur gratuit : http://www.sharpdevelop.net/
---
Mon site :
Pleins de logiciels, trucs astuces et aide pour VB.net ...
www.et1-vb.net
ratala
Messages postés
248
Date d'inscription
jeudi 3 février 2005
Statut
Membre
Dernière intervention
22 juin 2008
-
A ok, merci.
Et est-ce qu'il est possible de faire des .exe et des .dll avec du VB.NET ?
Est-ce qu'il est possible de trouver un compilateur VB.NET gratuit ?
econs
Messages postés
4066
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
18 -
Ah la la .. L'éternel débat "VB ou VB.NET" !!
Si les deux existent, c'est qu'ils ont un intérêt.
Il faut juste savoir que VB6 n'évoluera plus, alors que VB.NET est la dernière mouture de Microsoft, et que .NET sera au coeur de tout ce qu'ils vont faire dans les prochaines années.

Suivant tes besoins, il faut choisir l'un ou l'autre (ou les deux).
ratala
Messages postés
248
Date d'inscription
jeudi 3 février 2005
Statut
Membre
Dernière intervention
22 juin 2008
-
Salut tout le monde, je suis tombé sur ta source (qui m'avait l'air intéréssante) et puis je me suis rendu compte que c'était du dotnet, maintenant que je voi toutes ces sources en dotnet je me pose la question : qu'est-ce qui est mieux : VB ou VB.net ??
parce que j'hésite a passer en dotnet...
@+
cs_volnay
Messages postés
12
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
24 mai 2006
-
As tu deja fais des tests avec ta methode sur un gros fichier texte, quel sont les temps de réponse?