Пример как прочитать большой кривой текстовый файл

 

Как прочитать кривой HTM-файл , чтобы не потерять самое важное?

Я придумал следующий хитрый ход:

// 1- открыть файл, внимание на флаги
ResetLastError();
int handle = FileOpen("file.htm", FILE_READ | FILE_BIN | FILE_ANSI);

    
if(handle == INVALID_HANDLE){
  Print("Не удалось открыть HTM-file: "+(string)GetLastError());
  return;
}


int i;
long seek=0;
string delimiter="", row="", rows[], rows_="", value="";
    
    
// 2- записать весь файл в одну строку
while(!FileIsEnding(handle)){
  FileSeek(handle, seek, SEEK_SET);
  row = FileReadString(handle, 2000);
  rows_ += row;
  seek += 2000;
}
    
FileClose(handle);
    
    
// 3- перебрать созданную строку и разделить ее по разделителю
for(i=0; i<StringLen(rows_); i++){
  value = StringSubstr(rows_, i, 1);
  row += value;
  
  if((value == "<" && delimiter == "") || 
     (value == "/" && delimiter == "<") ||
     (value == "t" && delimiter == "</") ||
     (value == "r" && delimiter == "</t") ||
     (value == ">" && delimiter == "</tr")) delimiter += value;
  else delimiter = "";
      
  if(delimiter == "</tr>"){
    ArrayResize(rows, ArrayRange(rows, 0)+1);
    rows[ArrayRange(rows, 0)-1] = row;
    delimiter = "";
    row = "";
  }
}
    
    
// 4- наконец, перебрать массив строк и порадоваться
for(i=0; i<ArrayRange(rows, 0); i++){
  row = rows[i];
  // здеся порадоваться
}
    


Основная засада с кривым HTM-файлом в том, что в нем могут быть HTML-символы, которые могу создавать разрывы. Поэтому простое построчное чтение, вероятно заложенное в функцию FileOpen, меня никак не устроило. Долго думал и придумал.

Самое главное преимущество такого подхода в том, что я могу использовать любой разделитесь, например, </tr>. Его только нужно грамотно составить: см. строки где собирается delimiter

 
// 1- открыть файл, внимание на флаги

Если FILE_BIN то нет смысла в FILE_ANSI.

Файл html это текстовый файл, нет смысла открывать его в бинарном режиме.

В чем смысл всех этих манипуляций? По идее надо бы выкинуть теги, но тут вроде просто деление на строки по какому-то набору символов. 

 

Если вы выкинете теги, как вы вообще отличите потом а от б?

Смысл манипуляций в том, что я перепробовал все флаги, и именно такая комбинация манипуляций наконец заработала

FILE_BIN откроет кракозябры без FILE_ANSI. Без FILE_BIN вообще не откроет. Вот и смысл. Строго путем и методом научного тыка.

 
evgeniy scherbina:

1. Если вы выкинете теги, как вы вообще отличите потом а от б?

2. Смысл манипуляций в том, что я перепробовал все флаги, и именно такая комбинация манипуляций наконец заработала

FILE_BIN откроет кракозябры без FILE_ANSI. Без FILE_BIN вообще не откроет. Вот и смысл. Строго путем и методом научного тыка.

1. Вообще то я только спросил, чего вы пытаетесь добиться?

2. Еще можно вознести молитву святой летучей макаронине.

 
Это пример открытия большого кривого файла, который я не нашел на форуме. А очень было надо. Так что будущие поколения мне скажут спасибо. А сейчас можно меня спокойно не признавать.
 
evgeniy scherbina:
Это пример открытия большого кривого файла, который я не нашел на форуме. А очень было надо. Так что будущие поколения мне скажут спасибо. А сейчас можно меня спокойно не признавать.
В чем его кривизна? Что было не так при обычном чтении? Давайте ка сюда это файлик.
 

Возьмите файл этой страницы на которой вы что-то пишите а вам что-то отвечают. И попробуйте открыть его так, чтобы из него можно было что-то вынуть.

Нужно именно деление через FILE_BIN с помощью FILE_SEEK чтобы открывать по кусочеку. Это работает! 

 
evgeniy scherbina:

Возьмите файл этой страницы на которой вы что-то пишите а вам что-то отвечают. И попробуйте открыть его так, чтобы из него можно было что-то вынуть.

Нужно именно деление через FILE_BIN с помощью FILE_SEEK чтобы открывать по кусочеку. Это работает! 

Для чистоты эксперимента приложите свой файл. 

Если сохраню страницу, у меня она будет в UTF-8 и все будет совсем не так. 

 
ды-к
Файлы:
file.zip  18 kb
 
evgeniy scherbina:
ды-к
Файл ANSI. В чем проблема при чтении построчно?
 
В том что мне нужна строка от <tr> до </tr>. Внутри некоторых строк есть спец символы, которые разрывают строку. Либо строка обрывается по длине. 
Причина обращения: