Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 08.02.2015
Сообщений: 23

Подсчет смещения строк

14.02.2015, 20:25. Показов 3923. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Помогите написать алгоритм смещения строки по такому принципу:
Например у нас есть несколько строк
Code
1
2
3
11535759    ucdt    ADD NEW CARD
12593078    ucdt    Madrid (EU)
18811314    ucdt    Menu No. 15
Допустим, что смещение начальной строки 3, нужно, опираясь на начальное смещение, подсчитать смещение остальных 2х строк.

Добавлено через 10 минут
И сразу же второй вопрос. Даны две строки:
Code
1
2
3
4
5
6
7
8
18811314    ucdt    Menu No. 15;
 
Meal Ready-To-Eat, Individual;
 
US Government Property; Commercial Resale Is Unlawful
 
[Replenishes a small amount of energy]
22441232    ucdt    Sheffield (EU)
Как сделать так, чтобы смещение подсчитывалось не обгрызая первую строку? (строки начинаются с ID, например, 22441232)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.02.2015, 20:25
Ответы с готовыми решениями:

Подсчет смещения строк и байт в этих строках
Всем привет. Пришли с другом в тупик. А именно, ранее была написана прога, которая выполняла то, что написано в оглавлении. Делала она все...

Работа с массивом строк. Подсчет строк определенного содержания
Сейчас выглядит это так: listBox2.Items.Clear(); listBox1.Items.Clear(); String filename =...

Нужен подсчет строк по каждому договору в первой и второй таблице.Количесьво строк может меняться
И снова здраствуйте. Помогите пожадуйста с двумя вопросами. 1 нужен подсчет строк по каждому договору в первой и второй таблице.Количесьво...

41
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
16.02.2015, 10:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от fenymak Посмотреть сообщение
1 столбец - ID, 2 - смещение строки, 3 - кол-во байт в строке.
Для англ и рус они различаются, вот мне и нужно вычислить рус.
Цитата Сообщение от fenymak Посмотреть сообщение
А функция данного алгоритма заключается в том, чтобы проверить наличие кириллических символов в строке, чтобы потом принять их за 2 байта.
Не нужно это делать вручную. mss уже упоминал, что это строка в кодировке UTF-8. Т. е., надо получить представление строки в кодировке UTF-8 и вычислить длину этой строки. Для всего этого в Delphi уже есть готовые функции.
Delphi
1
2
3
4
5
6
7
8
9
10
var
  S : String;
  Sutf8 : Utf8String; //type Utf8String = AnsiString. AnsiString - строка однобайтных символов.
  Len : Integer;
begin
  S := 'Содержание строки.'; //Исходная строка.
  Sutf8 := UTF8Encode(S);    //Получаем строку в кодировке UTF-8.
  Len := Length(Sutf8);      //Длина UTF-8 строки, выраженная в байтах.
  ShowMessage('Длина UTF-8 строки в байтах = ' + IntToStr(Len));
end;
1
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
16.02.2015, 11:10
А при наличии XE-версии и того проще - просто грузим строку в переменную UTF8String
0
0 / 0 / 0
Регистрация: 08.02.2015
Сообщений: 23
16.02.2015, 12:28  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
что мешает сторонней программе корректно показать эту строку ?
Я не знаю, что ей мешает подсчитывать, но факт в том, что кириллические символы должны занимать 2 байта в строке, а все остальное (латиница, зн. препинания, пробелы, цифры) занимать 1 байт, после чего прибавляется еще 2 байта к строке (видимо enter при переходе на след. строку), из чего рассчитывается смещение след. строки. У нас почти готовая прога, с латиницей она все отлично просчитывает, а вот с кириллицей какие-то непонятки. Расчет байтов с кириллицей приведет в алгоритме выше. Может там где-то ошибка?

Добавлено через 1 минуту
Цитата Сообщение от Mawrat Посмотреть сообщение
Т. е., надо получить представление строки в кодировке UTF-8
Выяснить для чего? файл весь и так в UTF-8, зачем это выяснять? или что-то другое имел в виду?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
16.02.2015, 13:18
При формировании dir-файла тебе нафих не нужно знать кириллица там в файле или не кириллица)
Достаточно гарантии того что каждая строка в файле имеет предопределенную терминирующую цепочку (#13#10 в случае с представленным тобой образцом в .dat-файле)

Длина строки в байтах определяется разностью позиции начала терминатора и позицией начала строки плюс длина терминатора

Поиск позиции терминатора следует осуществлять трактуя содержимое строки как RawByteString

Добавлено через 1 минуту
и сам терминатор тоже следует трактовать как RawByteString
0
0 / 0 / 0
Регистрация: 08.02.2015
Сообщений: 23
16.02.2015, 13:41  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
Для всего этого в Delphi уже есть готовые функции
А по поводу второго вопроса можете что-нибудь посоветовать? чтобы несколько строк считались за одну
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
16.02.2015, 14:49
fenymak,
изучай
прочувствуй как все на самом деле просто)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TForm1.Button6Click(Sender: TObject);
var
  ms: TMemoryStream;
  re: TRegEx;
  s, s1: RawByteString;
  mc: TMatchCollection;
  i, len, n: Integer;
begin
  memo.Clear;
  n := 3;
  ms := TMemoryStream.Create;
  ms.LoadFromFile('en_us_data.dat');
  ms.Position := n;
  SetLength(s, ms.size - ms.Position);
  CopyMemory(PAnsiChar(s), ms.Memory, Length(s));
  ms.Free;
  re.Create('([0-9]+)[\t|\s]+.*');
  mc := re.Matches(s);
  for i := 0 to mc.Count - 1 do
  begin
    s1 := mc[i].Value;
    len := Length(s1);
    s1 := mc[i].Groups[1].Value;
    Memo.Lines.Add(s1 + #9 + IntToStr(n) + #9 + IntToStr(len));
    n := n + len + 2;
  end;
end;
0
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 14
16.02.2015, 16:53
А как быть если я пользуюсь Delphi 7 и у меня он ругается на эти 3 строки?
re: TRegEx;
s, s1: RawByteString;
mc: TMatchCollection;

Только не надо мне XE советывать, я пока не готов в нём работать.
0
0 / 0 / 0
Регистрация: 08.02.2015
Сообщений: 23
16.02.2015, 17:04  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
прочувствуй как все на самом деле просто
Не дружит мой Дельфи 7 с этим кодом. Ругается на эти три строки:
[16:41:17] Сафронов Ярослав (SJW Records):
Delphi
1
2
3
re: TRegEx;
  s, s1: RawByteString;
  mc: TMatchCollection;
[16:41:59] Сафронов Ярослав (SJW Records): Спроси может помогут мне это обойти. Не хочу я огромный Дельфи XE тянуть с нета.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
16.02.2015, 19:22
Для еще не разродившихся переходом на ХЕ-линейку есть TRegExpr и тип AnsiString
0
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 14
16.02.2015, 19:24
Цитата Сообщение от mss Посмотреть сообщение
Для еще не разродившихся переходом на ХЕ-линейку есть TRegExpr и тип AnsiString
Я это скачал. Но не знаю как теперь этот код переделать?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
16.02.2015, 19:27
Там есть вменяемая и довольно подробная справка.
0
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 14
16.02.2015, 19:31
Цитата Сообщение от mss Посмотреть сообщение
Там есть вменяемая и довольно подробная справка.
Может я сморел не внимательно, но я не нашёл там упоминание о RawByteString и о TMatchCollection.
Там вроде только про TRegExpr всё описывается.

Может всё же поможете мне?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
16.02.2015, 19:48
Цитата Сообщение от sjwrec Посмотреть сообщение
не нашёл там упоминание о RawByteString
Его там нет и быть не может.
Пользуй AnsiString.

В папке Demos есть пример - ф-ция ExtractEmails.
Вот по ее образцу и пользуй
0
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 14
16.02.2015, 20:13
Цитата Сообщение от mss Посмотреть сообщение
В папке Demos есть пример
Всё бы хорошо, но в архиве нет этой папки..
А на сайте тоже не могу её найти ((
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
16.02.2015, 20:20
Да вот же)
2
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 14
16.02.2015, 20:35
Цитата Сообщение от mss Посмотреть сообщение
Да вот же)
Точно. А то саму библиотеку скачал. А там нету папок ))
Спасибо.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
16.02.2015, 21:24
Вариант для Д7 без сторонних библиотек:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm1.Button1Click(Sender: TObject);
var
  i, n, d: Integer;
  sL: TStringList;
begin
  n := 3;
  d := 2;
  Memo1.Clear;
  Memo1.Lines.BeginUpdate;
  sL := TStringList.Create;
  sL.LoadFromFile('D:\en_us_data.dat');
  sL.Text := StringReplace(sL.Text, #13#10#13#10, 'aa', [rfReplaceAll]);
  sL[0] := Copy(sL[0], n+1, MaxInt);
  with TStringList.Create do
  begin
    for i := 0 to sL.Count - 1 do
    begin
      CommaText := sL[i];
      Memo1.Lines.Add(Strings[0] + #9 + IntToStr(n) + #9 + IntToStr(Length(sL[i])) + #9 + 'd');
      inc(n, Length(sL[i]) + d);
    end;
    Free;
  end;
  sL.Free;
  Memo1.Lines.EndUpdate;
end;
2
16.02.2015, 21:32

Не по теме:

Цитата Сообщение от FIL Посмотреть сообщение
Вариант ..без сторонних библиотек
Не по феньшую, но тоже сойдет)
Главное чтобы ТС понял какой кошмарный велосипед с детектором кириллицы он чуть не изобрел)

0
16.02.2015, 21:47

Не по теме:

Цитата Сообщение от mss Посмотреть сообщение
чуть не изобрел
Вовремя остановили)

0
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 14
16.02.2015, 22:00
Цитата Сообщение от FIL Посмотреть сообщение
Вовремя остановили)
Изобрёл и уже давно ))
Другая прога на подобном коде работает.
А эта уже на вашем коде работает.
Пока вроде косяков в работе не заметил, тестирую дальше. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2015, 22:00

Подсчет количество строк в textbox-e и удаление строк
Как подсчитать количество строк в текстбоксе и вывести в label. В текст боксе загружен любой текстовый файл. И как удалить строчку...

Нужно реализовать подсчет строк строк от 1 до n
Пытаюсь написать базу данных. Проблема в том что не могу ни как реализовать в таблице подсчет строк, что бы в дальнейшем использовать на...

Подсчет количества уникальных строк и числа строк с каждым из уникальных значений
Здравствуйте, есть таблица с текстовой колонкой. Нужно получить количество строк, в которых значение этой колонки уникально и число строк...

Подсчет строк
Написать программу на Паскале,выводящую статистику текстового файла: перечислить все образцы строк и по сколько раз они...

подсчет строк
Доброе время суток! Помогите пожалуйста правильно написать. Хочу посчитать, все поля в классе или форме( это не важно), за исключением...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru