1

次の形式のテキストファイルがあります。

(title,price,id#)

CD1,11.00,111111
CD2,12.00,222222
CD3,13.00,333333
CD4,14.00,444444
CD5,15.00,555555
CD6,16.00,666666

ID番号と新しい価格が与えられた場合、適切なCDの価格を変更するための最良の方法は何ですか?

行を取得して分割することと関係があると確信していますが、1行だけを編集して、ファイル全体を台無しにしない方法がわかりません。

4

3 に答える 3

2

さて、これで短いファイルであることがわかりました。作業がはるかに簡単になります。

  • を使用してファイルを行の配列にロードしますFile.ReadAllLines
  • string.Split各行を構成部分に分割するために使用して正しい行を見つけ、 IDを確認します。
  • 正しい行を見つけたら、それを完全な新しい行に置き換えます
  • 次のコマンドでファイルを書き戻しますFile.WriteAllLines

それはあなたを動かすのに十分なはずです。

于 2012-04-11T07:28:28.760 に答える
2

ファイル全体を書き換えずに行を書き換えることはできません(行が同じ長さである場合を除く)。このような小さなファイルの場合、メモリ内の行を変更してから、すべてをファイルに書き換えるのがおそらく最も簡単です。

Dim idToFind = "444444"
Dim newPrice = "100"
Dim lines = IO.File.ReadAllLines(path)
For i = 0 To lines.Length - 1
    Dim line = lines(i)
    Dim fields = line.Split(","c)
    If fields.Length > 2 Then
        Dim id = fields(2)
        If id = idToFind Then
            Dim title = fields(0)
            lines(i) = String.Format("{0},{1},{2}", title, newPrice, id)
            Exit For
        End If
    End If
Next
IO.File.WriteAllLInes(path, lines)
于 2012-04-11T07:35:44.157 に答える
0

25行のようなファイルの場合は、単純なinput-transform-outputルーチンを実行して、1行あたりの価格を更新できます。

このようなもの(Streamreader / writerを使用)。

Sub UpdatePrice(ByVal pricesToUpdate As Dictionary(Of Integer, String), ByVal inputPath As String)
    If Not IO.File.Exists(inputPath) Then Return
    Try
        Using inputStream = New IO.StreamReader(inputPath, System.Text.Encoding.UTF8, True)
            Using outputStream = New IO.StreamWriter(inputPath + ".tmp", False, System.Text.Encoding.UTF8)
                While Not inputStream.EndOfStream
                    Dim inputLine = inputStream.ReadLine
                    Dim content = inputLine.Split(","c)
                    If Not content.Length >= 3 Then
                        outputStream.WriteLine(inputLine)
                        Continue While
                    End If
                    Dim id As Integer
                    If Not Integer.TryParse(content(2), id) Then
                        outputStream.WriteLine(inputLine)
                        Continue While
                    End If
                    If Not pricesToUpdate.ContainsKey(id) Then
                        outputStream.WriteLine(inputLine)
                        Continue While
                    End If
                    content(1) = pricesToUpdate(id)
                    outputStream.WriteLine(String.Join(",", {content(0), content(1), content(2)}))
                End While
            End Using
        End Using
        If IO.File.Exists(inputPath + ".tmp") Then
            IO.File.Delete(inputPath)
            IO.File.Move(inputPath + ".tmp", inputPath)
        End If
    Catch ex As IO.IOException
        If IO.File.Exists(inputPath + ".tmp") Then IO.File.Delete(inputPath + ".tmp")
    End Try
End Sub
于 2012-04-11T07:37:46.913 に答える