Обработка текстовых файлов с помощью базы данных SQL — Visual Basic

У меня есть текстовый файл, содержащий записи с разделителями.

1243;jhhf';982u4k;9u2349;huf8
kij;9238u;98ur23;jfwf;03i24

Мне нужно заменить значение 4-й части каждой записи значением, возвращаемым из базы данных SQL (Select X from T where C='4Th part from the flatfile').

С уважением,
Сантош.


person Santhosh_ms3    schedule 20.01.2012    source источник
comment
Обратите внимание, что часть моего ответа взята из моего предыдущего ответа на сообщение OP stackoverflow.com/questions/8922426/   -  person Marco    schedule 20.01.2012


Ответы (1)


Попробуй это:

Dim newLines As List(Of String) = New List(Of String)
Dim sqlConn As New SqlConnection(connectionString)
Dim SQLCmd As New SqlCommand()
SQLCmd.Connection = sqlConn
Dim lines As String() = File.ReadAllLines(filename)
sqlConn.Open()
For Each line As String In lines
    Dim parts As String() = line.Split(";")
    SQLCmd.CommandText = "Select X from T where C=""" & parts(3) & """"
    Dim dr As SqlDataReader = SQLCmd.ExecuteReader
    While dr.Read()
        parts(3) = dr("X")
    End While
    newLines.Add(String.Join(";", parts))
Next
File.WriteAllLines(filename, newLines.ToArray())
sqlConn.Close()
person Marco    schedule 20.01.2012
comment
Исключение System.IndexOutOfRangeException было необработанным. Сообщение = Индекс находился за пределами массива. - person Santhosh_ms3; 23.01.2012
comment
@ user1157902: это означает, что line.Split вернул менее 4 частей, поэтому я думаю, что ваш файл не такой, как вы описали .... - person Marco; 23.01.2012
comment
A;B;C;160;D /n X;Y;Z;161;W/n P;Q;R;162;S/n A;B;C;163;D/n (4 строки) Это содержимое. я просто тестирую, прежде чем внедрять в реальность. - person Santhosh_ms3; 23.01.2012
comment
@Santhosh_ms3: я попробовал свой код, и он у меня работает; Я отредактировал его, потому что имя устройства чтения данных было неправильным, но я не могу воспроизвести вашу ошибку. Вы уверены насчет /n? Это новая строка? - person Marco; 23.01.2012
comment
да, это (\n) новая строка. На самом деле я получил ошибку {Уже есть открытый DataReader, связанный с этой командой, который должен быть закрыт в первую очередь.} поэтому закройте Sqldr как SQLdr.close() . после этого получение индекса исключения было за пределами массива - person Santhosh_ms3; 23.01.2012
comment
@Santhosh_ms3: эй, ты должен отладить свое приложение!! Поставьте точку останова на SQLCmd.CommandText = ... строку и проверьте (для каждой строки в вашем файле), что part.Length действительно пять, как и должно быть. Вы можете сделать много вещей, чтобы найти проблему... это называется отладкой! :) - person Marco; 23.01.2012
comment
Спасибо Марко. В этом была проблема. Были пробелы в 5-й и 6-й строке. поэтому добавил условие, если части.Длина › 1. Можете ли вы предложить какие-либо книги для новичков? - person Santhosh_ms3; 23.01.2012
comment
@Santhosh_ms3: извините, я начал программировать почти 30 лет назад, поэтому я не знаком с книгами для новичков, которые продаются сегодня. Я видел, как ты оторвался от моего ответа: есть ли какая-то особая причина? - person Marco; 23.01.2012
comment
@Santhosh_ms3: нет, ты не принял ни того, ни другого. Вы уверены, что сделали? См. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work - person Marco; 23.01.2012