2009-09-02 8 views
0

j'ai un fichier texte contenant les données au format suivantdonnées Écriture dans un fichier texte à la position particulière

12345 Abdt3 hy45d et45a 76huj agsj7 

Maintenant, je veux remplacer hy45d avec une autre piqûre qui est créé à l'heure de l'exécution. Mais je ne trouve aucun moyen de le faire. Il continue à remplacer le premier élément ou l'ajouter à la ligne suivante.

Quelqu'un peut-plz me aider à résoudre ce problème

code que j'utilise est

Public Sub SaveToTextFile(ByVal PNR As String, ByVal CaseCount As Integer, ByVal Type As String) 


    '- Location of the Text files 
    Dim targetFile As String = "C:\TestReport\TextFiles\PNR.txt" 

    '- Open the target file/stream 
    Dim sw As StreamWriter = New StreamWriter(targetFile, True) 

    ' Try 
    If (CaseCount = 0 And Type = 1) Then 
     sw.Write(PNR, 0, 6) 
    ElseIf (CaseCount = 1 And Type = 1) Then 
     sw.WriteLine(PNR, 6, 7) 
    ElseIf (CaseCount = 2 And Type = 1) Then 
     sw.WriteLine(PNR, 13, 7) 
    ElseIf (CaseCount = 3 And Type = 1) Then 
     sw.WriteLine(PNR, 20, 7) 
    ElseIf (CaseCount = 0 And Type = 2) Then 
     sw.WriteLine(PNR, 27, 7) 
    ElseIf (CaseCount = 1 And Type = 2) Then 
     sw.WriteLine(PNR, 34, 7) 
    ElseIf (CaseCount = 2 And Type = 2) Then 
     sw.WriteLine(PNR, 41, 7) 
    ElseIf (CaseCount = 3 And Type = 2) Then 
     sw.WriteLine(PNR, 48, 7) 
    ElseIf (CaseCount = 0 And Type = 3) Then 
     sw.WriteLine(PNR, 55, 7) 
    ElseIf (CaseCount = 1 And Type = 3) Then 
     sw.WriteLine(PNR, 62, 7) 
    ElseIf (CaseCount = 2 And Type = 3) Then 
     sw.WriteLine(PNR, 69, 7) 
    ElseIf (CaseCount = 3 And Type = 3) Then 
     sw.WriteLine(PNR, 76, 7) 
    End If 

    'Catch ex As Exception 
    ' Console.Write(ex.ToString()) 
    'End Try 

    sw.Close() 
End Sub 
+0

Il serait utile si vous avez posté le code que vous utilisez en ce moment –

Répondre

1

Il n'y a aucun moyen de le faire. Les fichiers texte peuvent utiliser des codages qui allouent plus d'un octet pour un caractère. Autrement dit, même si vous connaissez la position caractère de la chaîne cible, vous ne connaissez pas (en général) sa position d'octet.

Les classes .NET interdisent donc raisonnablement l'accès aléatoire aux fichiers texte. La manière standard d'y faire face est de lire l'ensemble (ou au moins une partie) du fichier texte, de changer la chaîne et de réécrire la chaîne modifiée.

Alors:

Dim text = My.Computer.FileSystem.ReadAllText("File.txt") 
text = text.Replace("hy45d", "myfancynewstring") 
My.Computer.FileSystem.WriteAllText("File.txt", text, False) 

court et doux.

Ou, si vous voulez effectuer une recherche par colonne:

Dim text = My.Computer.FileSystem.ReadAllText("File.txt") 
Dim columns = text.Split(" "c) 
'' // Replace third column: 
columns(2) = "myfancynewstring" 
My.Computer.FileSystem.WriteAllText("File.txt", String.Join(" ", columns) , False) 
+1

Notez que toutes mes publications de code VB impliquent «Option Strict On», «Option Explicit On» et «Option Infer On», les seuls paramètres raisonnables pour VB. –

+0

Pouvez-vous élaborer votre code qui est la recherche par colonne –

+0

@sam: Je ne sais pas vraiment ce que vous voulez. La mise à jour de votre question semble n'avoir rien à voir avec la question originale. Mon code ne cherche rien, puisque je ne sais pas ce que vous voulez dire par là, il met juste à jour la troisième colonne de texte. –

0

façon de la force brute serait de lire le fichier entier, remplacer toutes les instances de « hy45d » et remplacer le contenu (entier) du fichier avec la nouvelle chaîne.

pseudocode:

S = readfile; 
S = replace(S, "hy45d", "hello"); 
writeToFile(S); 

(je crois que la seule façon d'écrire des fichiers est d'ajouter ou de remplacer, je peux me tromper bien)

EDIT

Si vous voulez colonnes et lignes individuelles, vous pouvez utiliser un tokenizer par ligne. (délimiteur probablement ""). (je suis sûr qu'il ya une bibliothèque de chaîne pour vb.net qui peuvent soit les chaînes tokenize ou fractionnés, au moins this guy/girl semble avoir écrit quelques fonctions de chaîne utiles http://www.codeproject.com/KB/vb/stringfunctions.aspx)

Si vous voulez faire plusieurs remplacements, il pourrait être utile de le lire dans un tableau 2D, remplacer un mot dans colonne/ligne serait alors trivial, mais il pourrait devenir un cochon de mémoire si vous avez de gros fichiers.

+0

Non Je veux faire une recherche par position et non par contenu. Je veux dire dans une ligne particulière à une colonne particulière. –

+0

alors? vous pouvez analyser les chaînes, n'est-ce pas? il suffit d'utiliser le même algorithme que vous auriez pour trouver la colonne/ligne et l'appliquer à la chaîne – NomeN

0

Pour autant que je sache, il n'y a vraiment pas de "bonne" façon de le faire dans le .Net Framework. Vous avez à peu près deux choix.

1) Lire le fichier entier en mémoire, faire votre mise à jour, réécrire le fichier sur le disque.

2) Faites l'équivalent de la lecture et de l'écriture directement sur l'emplacement du disque physique - ce que je ne suis pas sûr de pouvoir faire dans le cadre.

Est-ce que convertir le fichier en quelque chose de non-séquentiel (comme une base de données) une option?

+0

En fait, j'ai besoin d'une réplication d'Excel. Comme Excel provoque trop de problèmes sur le serveur. Alors maintenant je veux lire et écrire des données dans un fichier texte comme Excel. –

1
  1. Position de recherche d'octets par fonction de recherche.
  2. Définissez la nouvelle position du flux de curseur par filestream.Seek (bytepos, seekorigin.Begin).
  3. Ensuite, écrivez ou ajoutez une chaîne à cette ligne pos. Et le rincer.
Questions connexes