none
"InStr" Поиск подстроки под VB.Net RRS feed

  • Вопрос

  • Здравствуйте !

    Проблема в следующем: под VB6 программный код работает: считывает текстовый xml файл в переменную типа String и ищет с помощью InStr определенный текст. Переставляю все на VB.net - глючит InStr, не находит искомую подстроку.

    Код простой:

    Программа вызывает функцию "txt_ReadAll" (см.ниже), получает от нее весь xml-файл как строку

    XML_stroka = txt_ReadAll(XML_Pfad + XML_File)

     и ищет вхождение текста переменной Neue_PDF в строке XML_stroka с помощью InStr

    Neue_PDF="69697605"

    Position_PPId = InStr(XML_stroka, Neue_PDF)

    Функция:

    Public Shared Function txt_ReadAll(ByVal sFilename As String) As String

            Dim F As Integer
            Dim sInhalt As String
            If Dir$(sFilename, vbNormal) <> "" Then
                F = FreeFile()
                FileOpen(F, sFilename, OpenMode.Binary)
                sInhalt = Space$(LOF(F))
                FileGet(F, sInhalt)
                FileClose(F)
            End If
            txt_ReadAll = sInhalt
        End Function

    =============================

    Вроде куда проще, но результат работы InStr всегда 0. Файл xml прибл. 2,5Mb, содержит также порядком двойных кавычек, но VB6 код работает безупречно, а под VisualStudio 2017 VB.Net глючит.

    Я уперся - может какие идеи есть: VB-код ? версия .NET Framework ? кодировка ?

    Или вместо InStr как-то организовать поиск внутри файла ?

    Спасибо заранее...

    4 ноября 2019 г. 21:22

Все ответы


  • Для начала можете выкинуть эту функцию:

    Public Shared Function txt_ReadAll(ByVal sFilename As String) As String

    И заменить ее на вызов System.IO.File.ReadAllText(...)

    По умолчанию кодировка UTF-8. Если файл в другой кодировке, то следует ее указать.

    Так же выкинуть InStr() (и вообще все наследственные функции VB) и заменить ее на String.IndexOf()

    Но вообще лучше все переписать, видимо с загрузкой XML в DOM вместо того чтоб искать подстроки.

    Кстати, не повредит так же запустить отладчик и посмотреть правильно ли считалось содержимое файла.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Предложено в качестве ответа Alexandr_Smirnoff 5 ноября 2019 г. 2:03
    4 ноября 2019 г. 22:26
    Модератор
  • Спасибо, попробую... Хотя,

    1. как System.IO.File.ReadAllText уже пытался. Та же самая проблема с InStr выплывает

    2. считывается все правильно, т.к. я для контроля уже вставлял в функцию сразу же вывод в новый файл, открывал его в Notepad++, там все в порядке...

    А с DOM идея хорошая, сделаю , спасибо.

    Правда из упрямства хотелось бы разобраться с InStr, где клинит. Может правда неправильно считывается, но ведь прямой вывод в новый файл в порядке...

    По любому, спасибо большое !

    5 ноября 2019 г. 12:19
  • Нашел наконец-то...  и код рабочий, и переделывать ничего не придется.

    Сам виноват: файл, что считывается в переменную String, очень большой. А результат работы функции Instr присваивается переменной, которую я почему-то определил, как Short, а не Integer. Short же работает только лишь до 32768, а потом без выдачи ошибки переполненная переменная становится равна 0.

    Спасибо еще раз всем, особенно   Alexandr_Smirnoff


    6 ноября 2019 г. 21:22