2009-12-19 5 views
1

J'ai un fichier txt avec des données qui ressemble à ceci:données de mise à jour dans le fichier txt/xml en C#

a:1(2,3) 55(33,45,67) 
b:2(1,33,456) 4(123,12444) 

qui signifie ce mot « un » apparaît dans le texte 1 dans des endroits 2 et 3 et texte 55 dans les lieux 33,45 et 67 ..

J'ai quelques textes et je vais partout dans ces textes et si je vois que le mot "a" apparaît dans un texte, alors je dois mettre à jour le fichier texte ci-dessus en conséquence . (Les données sur « un » peut être plus grande qu'une ligne bien sûr)

Comment puis-je mettre à jour la ligne où « a » est sans endommager la ligne où « b » est? J'ai vu ici dans stackoverflow que je peux utiliser peut-être un fichier xml. Si j'utilise le fichier xml, puis-je lire l'ensemble des données "a", le mettre à jour et le réécrire sans endommager la ligne "b"? Ou peut-être que chaque donnée sur un mot peut se trouver dans une structure de données que je peux lire d'une manière ou d'une autre dans le fichier, la mettre à jour puis l'écrire au même endroit?

Merci à l'avance,

Greg

Répondre

0

Si vous modifiez ce fichier texte au format XML, vous pouvez facilement manipuler le fichier en utilisant LINQ to XML.

Regardez here. Plus précisément, le manipulation section.

+0

comment linq linux au xml aide-t-il à manipuler des chaînes simples? –

+0

Comme je l'ai compris d'après ce que j'ai lu dans ce lien, vous pouvez simplement créer un document XML, puis vous pouvez simplement naviguer vers le XElement dont le contenu que vous souhaitez remplacer, puis utilisez la méthode ReplaceNodes(). –

+0

@hellfrost, s'il s'agissait d'une simple manipulation de chaîne, cela n'aiderait pas. Mais, Greg veut maintenir un fichier d'enregistrements qui suit les emplacements des mots. S'il y a beaucoup de mots et beaucoup d'emplacements, le traitement manuel d'un fichier ligne par ligne nécessite beaucoup de traitement inutile. L'utilisation de XML permettra un accès incrémentiel des enregistrements. @Greg. Correct. Mais, vous pouvez également trouver un élément XML (le mot) et insérer/mettre à jour/supprimer des nœuds qui référencent ce mot dans un texte. –

-1

utilisant: String.Insert

mais j'utiliser un [texte] tableau 2D int Places [place].

votre question n'a rien à voir avec XML que vous pouvez utiliser XML pour cela, une structure de données simple, serait plus simple ....

modifier:

utilisation ok ceci:

dictionary<string,dictionary<int,list<int>>> . 

utiliser un dictionery la clé serait votre mot la valeur serait une autre dictionery avec les numéros de texte et les lieux ... vous pouvez serlize tout cela à déposer par la voie ....

+0

Mais je ne connais pas la taille du tableau car je dois parcourir tous les textes et ajouter les occurrences des mots au fichier texte, mais je ne sais pas combien d'occurrences il y aura. De plus, comment puis-je naviguer exactement à l'endroit où le mot que j'ai besoin de mettre à jour existe dans le fichier texte si je tiens une structure de données pour chaque mot? –

1

Vous pourriez encoder les mêmes informations en XML avec

<words> 
    <word name="a"> 
    <text id="1"> 
     <place id="2" /> 
     <place id="3" /> 
    </text> 
    ... 
    </word> 
    ... 
</words> 

Comme vous pouvez le voir, XML a le même problème que le format texte: mises à jour nécessitent réécritures, de sorte qu'il ne sera pas autant d'aide que vous êtes en espérant.

Compte tenu de l'échantillon dans votre question, je suppose que vous n'êtes pas l'indexation d'un énorme corpus. Si oui, effectuez les mises à jour dans les étapes suivantes:

  1. Lisez le fichier d'index en cours dans la structure de données que vous utilisez pour l'index.
  2. Mettez à jour votre structure de données pour refléter le contenu des textes nouvellement ajoutés dans le corpus.
  3. écrire le contenu de l'index entier mis à jour à un nouveau fichier temporaire.
  4. En cas de succès, renommez le fichier temporaire dans le fichier index principal de l'étape 1.

Si vous avez un très grand corpus, l'index basé sur du texte est inapproprié. Envisagez d'utiliser une base de données réelle.

+0

+1 C'est exactement ce que j'ai décrit. Que considéreriez-vous comme un «très grand corpus»? Les données peuvent également être facilement chargées à partir de cette structure dans un DataSet et traitées en mémoire, puis ré-enregistrées après chaque "transaction". J'ai travaillé avec DataSets de plus de 6 000 enregistrements et je les ai trouvés seulement ralentir autour de 20 000 enregistrements (d'environ 10 mégaoctets). Dans ce cas, la pagination est requise. Cela peut être une limitation sur ma réponse LINQ to XML. –

Questions connexes