Что написано на предпоследней строке
Перейти к содержимому

Что написано на предпоследней строке

  • автор:

Что написано на предпоследней строке

Argument ‘Topic id’ is null or empty

Сейчас на форуме

© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru

Использование любых материалов сайта допускается строго с указанием прямой ссылки на источник, упоминанием названия сайта, имени автора и неизменности исходного текста и иллюстраций.

ООО «Планета Эксел»
ИНН 7735603520
ОГРН 1147746834949
ИП Павлов Николай Владимирович
ИНН 633015842586
ОГРНИП 310633031600071

Как добавить предпоследнюю строку в файл через консоль?

Доброго времени суток, подскажите пожалуйста, как добавить строку через консоль командой именно в предпоследнюю строку, так как последняя строка закрывается скобкой, и ее трогать нельзя.
param = какой то текст,
какой то текст,
какой то текст,
какой то текст,
какой то текст,
тут нужно добавить строку
>

  • Вопрос задан более трёх лет назад
  • 417 просмотров

Комментировать
Решения вопроса 1

fox_12

Расставляю биты, управляю заряженными частицами

Удалить последнюю строку
Дописать новую строку
Дописать скобку

param = какой то текст,
какой то текст,
какой то текст,
какой то текст,
какой то текст,
>

sed -i '$ d' 1.txt echo 'новая строка' >> 1.txt echo '>' >> 1.txt cat 1.txt

param = какой то текст,
какой то текст,
какой то текст,
какой то текст,
какой то текст,
новая строка
>

Что написано на предпоследней строке

Колонка1 Колонка2
Второе C
Второе D
Второе E
Второе F
Первое A
Первое B
Третье G
Третье H
Третье I

Необходимо из этой ТЗ вывести последние строки в другую ТЗ или массив с условием, что значения первой колонки равны.
Чтобы в итоге получилось такая таблица:

Второе F
Первое B
Третье I

Код такой примерно:

тз = Новый ТаблицаЗначений;
тз.Колонки.Добавить(«Колонка1»);
тз.Колонки.Добавить(«Колонка2»);
стр = тз.Добавить();
стр.Колонка1 = «Первое»;
стр.Колонка2 = «A»;
стр = тз.Добавить();
стр.Колонка1 = «Первое»;
стр.Колонка2 = «B»;
стр = тз.Добавить();
стр.Колонка1 = «Второе»;
стр.Колонка2 = «C»;
стр = тз.Добавить();
стр.Колонка1 = «Второе»;
стр.Колонка2 = «D»;
стр = тз.Добавить();
стр.Колонка1 = «Второе»;
стр.Колонка2 = «E»;
стр = тз.Добавить();
стр.Колонка1 = «Второе»;
стр.Колонка2 = «F»;
стр = тз.Добавить();
стр.Колонка1 = «Третье»;
стр.Колонка2 = «G»;
стр = тз.Добавить();
стр.Колонка1 = «Третье»;
стр.Колонка2 = «H»;
стр = тз.Добавить();
стр.Колонка1 = «Третье»;
стр.Колонка2 = «I»;

СтаршийИндекс = тз.Количество()-2;
Для сч=0 по СтаршийИндекс цикл
если тз[сч].Колонка1 = тз[сч+1].Колонка1 тогда
/////////////////
конецесли;
конеццикла;

Подскажите, что написать вместо комментариев?

До=»!№#»;
тз.Сортировать(«Колонка1,Колонка2»)
Для Каждого Стр Из тз Цикл
Если ДО<> «!№#» Стр.Колонка1<>ДО Тогда
//Добавляем куда надо Стр.колонка1 и Стр.Колонка2
КонецЕсли;
До=Стр.Колонка1;
КонецЦикла;

//Добавляем последний раз куда надо Стр.колонка1 и Стр.Колонка2

Обшибся немного:-) Вернее запомнаем не ДО_Колонка1 и ДоКолонка2
и их добавляем

Я так давным давно итги выводил поэтому запарился по привычке:-)

ну вобщем надеюсь смысл понятен:-)
группируешь по 1й выясняешь максимум номеров строк, соединяешь с исходной по номеру строки
(2) не совсем понял, ДО что?
(4) а если надо не совсем максимум последней колонки, а только последнее значение?
(6) вот и бери его из строки с максимальным номером
(7) так метод Свернуть() только суммы вычисляет, а ты говоришь надо Максимум
Как его вычислить?
(8) а соединение тебя не насторожило? я про запрос говорю

(9) Зачем тз добавлять в запрос, а потом обратно в тз, неужели по-другому нельзя?

Попробовал сделать так:
добавил в ТЗ еще одну колонку с именем «Максимум»

СтаршийИндекс = тз.Количество()-2;
Для сч=0 по СтаршийИндекс цикл
если тз[сч].Колонка1 = тз[сч+1].Колонка1 тогда
тз[сч].Максимум = сч;
конецесли;
конеццикла;

Почему-то в результате выполнения у последних строк пропуски » «

Перебираешь в отсортированной табличке строки. На каждом шаге знаешь две строки — текущую и предыдущую. Если ключ в первой колонке в этих двух строках различен, то в предыдущей строке искомые данные, которые надо слить в результат.
Все.

(10) не, ну можно и циклами сэмулировать то же. а зачем?
(11) сортировка похерит порядок второй колонки
Хуже студентов, чессдово.
Особо в пятницу.
(13) а она там зачем?

СтаршийИндекс = тз.Количество()-2;
Для сч=0 по СтаршийИндекс цикл
если тз[сч].Колонка1 = тз[сч+1].Колонка1 тогда
тз[сч].Максимум = сч;
конецесли;
конеццикла;

СтаршийИндекс = тз.Колонки.Количество() — 1;
Индекс = тз.Количество() — 1;
Пока Индекс >= 0 Цикл
Для Сч = 0 По СтаршийИндекс Цикл
Если ТипЗнч(тз[Индекс][Сч]) = Тип(«Число») Тогда
тз.Удалить(Индекс);
Прервать;
КонецЕсли;
КонецЦикла;
Индекс = Индекс — 1;
КонецЦикла;

А чтобы не парится с выходом за границу добавляешь после сортировки в конец барьер — пустую строку
Потом удаляешь
(15) ну ты ж предлагаешь сортирнуть и обходить
а у автора критерий последнести — максимальный номер строки
(16) нет. ибо тз.Удалить(Индекс). вчитываться не хочу

(20) да, нужна самая последняя строка с учетов значения первой колонки

код из (16) вроде бы нормально все делает

(21) так все работает же и выводит то, что я хотел
(23) на любых входных данных?
пересунь колонку со вторым в конец, а с третьим в начало

(25) так я же сортировку делаю заранее

тогда слушайся Маузера, если так хочется циклов. а ещё можно сразу получить таблицу нужного вида и не иметь головную мутотень с последующими сортировками и обходами

(28) меня вообще-то правильный вариант интересует, типа как будет самым верным решением?

В принципе могу ТЗ засунуть в запрос, а там уже отбирать.
Запросом будет правильнее?

(29) красивше — однозначно. быстрее — почти наверняка. строк кода меньше — точно нет
Вот и выросло поколение 1С-ников которые запросы знают лучше базовых алгоритмов программирования.

(30) ок, попробую запросом

(31) так в конструкторе запроса кодинг в основном кликами мышки, в то время как алгоритмы надо думать как писать xD

(30) Запросом и красивше? Кому как, но тормознее это почти наверняка ибо без группировок не обойтись вместо простого одного цикла.
Сложность выше O(N) как минимум O(2N) будет с запросом.

(32) Чему тут думать то? Тебе же сказали в (11) как сделать!

(32) правильно! думать над запросами — признак слабоумия. писать текст запроса руками — повод для прострела коленки

(33) ты не путай сложность алгоритма со скоростью исполнения

(34) я не совсем понял, что в (11) написано, т.е. мне надо таблицу обходить, проверяя равенство первой колонки и сравнивать значения второй колонки с предыдущей?

>Перебираешь в отсортированной табличке строки.
да, надо обходить
>На каждом шаге знаешь две строки — текущую и предыдущую.
это та, которая текущая и та, которая была перед ней
> Если ключ в первой колонке в этих двух строках различен,
отличаются ключи
>то в предыдущей строке искомые данные, которые надо слить в результат.
добавить текущую в результат

(5) блин проще сделать , чем объяснить:-)
лови пример
https://yadi.sk/d/WAhLO8rSuVmVw

КолСтрок = тз.Количество();
Для НомСтр = 0 По КолСтрок-2 Цикл
ТекСтр = тз[НомСтр];
СледСтрока = тз[НомСтр+1];
Если ТекСтр.Колонка1<>СледСтрока.Колонка1 Тогда
Сообщить(«»+ТекСтр.Колонка1+» — «+ТекСтр.Колонка2);
КонецЕсли;
КонецЦикла;
ТекСтр = тз[КолСтрок-1];
Сообщить(«»+ТекСтр.Колонка1+» — «+ТекСтр.Колонка2);

+(39) Это работающий модуль из обработки:

Процедура КнопкаВыполнитьНажатие(Кнопка)
ДоКол1=»ййй»;
ДоКол2=»ййй»;
Для Каждого Стр из тз Цикл
Если ДоКол1<>«ййй» Тогда
Если ДоКол1<>Стр.Колонка1 Тогда
Нов=тз2.Добавить();
Нов.Колонка1=ДоКол1;
Нов.Колонка2=ДоКол2;
КонецЕсли;
КонецЕсли;
ДоКол1=Стр.Колонка1;
ДоКол2=Стр.Колонка2;
Конеццикла;
Нов=тз2.Добавить();
Нов.Колонка1=ДоКол1;
Нов.Колонка2=ДоКол2;

Процедура ПриОткрытии()
тз.Колонки.Добавить(«Колонка1»);
тз.Колонки.Добавить(«Колонка2»);
тз2.Колонки.Добавить(«Колонка1»);
тз2.Колонки.Добавить(«Колонка2»);

стр = тз.Добавить();
стр.Колонка1 = «Первое»;
стр.Колонка2 = «A»;
стр = тз.Добавить();
стр.Колонка1 = «Первое»;
стр.Колонка2 = «B»;
стр = тз.Добавить();
стр.Колонка1 = «Второе»;
стр.Колонка2 = «C»;
стр = тз.Добавить();
стр.Колонка1 = «Второе»;
стр.Колонка2 = «D»;
стр = тз.Добавить();
стр.Колонка1 = «Второе»;
стр.Колонка2 = «E»;
стр = тз.Добавить();
стр.Колонка1 = «Второе»;
стр.Колонка2 = «F»;
стр = тз.Добавить();
стр.Колонка1 = «Третье»;
стр.Колонка2 = «G»;
стр = тз.Добавить();
стр.Колонка1 = «Третье»;
стр.Колонка2 = «H»;
стр = тз.Добавить();
стр.Колонка1 = «Третье»;
стр.Колонка2 = «I»;

тз.Сортировать(«Колонка1, Колонка2»);
Элементыформы.тз.СоздатьКолонки();
Элементыформы.тз2.СоздатьКолонки();

Запись в файл с проверкой последней строки

Есть переменная name_elem_site , значение которой необходимо записать в файл. Значение получаем из стороннего источника. Есть файл, изначально пустой. Нужно дописать значение переменной name_elem_site в этот файл на новой строке, но только в случае, если значение переменной не совпадает с последней строкой этого файла. Например, если последовательно приходят строки:

Текст Текст Текст Текст2 Текст Текст3 Текст2 Текст 

То в файл запишется только

Текст Текст2 Текст Текст3 Текст2 Текст 

т.к. были три подряд идущие одинаковые значения, а такое запрещено.
Отслеживать
52.2k 11 11 золотых знаков 109 109 серебряных знаков 312 312 бронзовых знаков
задан 21 дек 2016 в 13:22
43 11 11 бронзовых знаков

Если программа работает постоянно, сохраняем предыдущее значение и перед записью сравниваем с новым. Если записывает только одну строку за всю свою работу, то читаем файл, выбираем последнюю строку и сравниваем. В каком месте у Вас возникает проблема?

– user194374
21 дек 2016 в 13:34
@kff в проверке на последнею строку.
21 дек 2016 в 18:55

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Считывание последней строки из файла.

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

with open('test.txt') as file: last_line = file.readlines()[-1].strip() 

(Считываем все строки файла в список, берём последнюю, убираем символ новой строки, если он есть.)

Второй вариант. Чуть сложнее. Но не требует памяти для хранения файла целиком. В случае пустого файла также работает некорректно.

with open('test.txt') as file: for last_line in file: pass last_line = last_line.strip() 

(Читаем файл построчно. В переменной сохранится последняя прочитанная строка. Затем опять-таки удаляем символ новой строки, если таковой имеется.)

Третий вариант. Аналогичен первому, но корректно работает и в случае пустого файла. В этом случае last_line будет содержать значение None .

last_line = None with open('test.txt') as file: lines = file.readlines() if lines: last_line = lines[-1].strip() 

Четвёртый вариант. Аналогичен второму, но корректно работает и в случае пустого файла. В этом случае last_line будет содержать значение None .

last_line = None with open('test.txt') as file: for last_line in file: pass if last_line: last_line = last_line.strip() 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *