EFFACER UNE LIGNE DANS UN FICHIER TXT

cs_volnay Messages postés 12 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 24 mai 2006 - 18 mai 2006 à 08:30
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 juin 2006 à 17:43
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 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 juin 2006 à 17:42
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 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 juin 2006 à 22:41
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.
Utilisateur anonyme
6 juin 2006 à 12:53
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
6 juin 2006 à 00:01
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
5 juin 2006 à 20:20
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
5 juin 2006 à 19:32
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
5 juin 2006 à 18:36
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
5 juin 2006 à 16:32
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
5 juin 2006 à 15:25
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 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
4 juin 2006 à 19:41
De plus j'ai testé tout à l'heure avec un texte de 3GO ca rame mais ca met 5 minutes c'est tout.
Utilisateur anonyme
4 juin 2006 à 08:19
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 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
3 juin 2006 à 23:54
Normal on va pas travailler sur des textes énormes !
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 juin 2006 à 18:33
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 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
3 juin 2006 à 14:09
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
24 mai 2006 à 17:25
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 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 mai 2006 à 12:21
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
24 mai 2006 à 10:38
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
24 mai 2006 à 10:18
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 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 mai 2006 à 10:07
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
24 mai 2006 à 09:38
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
22 mai 2006 à 23:08
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
22 mai 2006 à 08:23
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 10
21 mai 2006 à 16:17
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
21 mai 2006 à 13:48
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
21 mai 2006 à 11:31
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
20 mai 2006 à 11:40
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
19 mai 2006 à 19:35
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
19 mai 2006 à 18:17
Genial !
cs_et1 Messages postés 250 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 27 janvier 2011 10
19 mai 2006 à 17:53
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
19 mai 2006 à 17:12
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 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
19 mai 2006 à 09:44
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
18 mai 2006 à 21:42
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
18 mai 2006 à 08:30
As tu deja fais des tests avec ta methode sur un gros fichier texte, quel sont les temps de réponse?
Rejoignez-nous