kokman_semenov
@kokman_semenov

Как в текстовый файл записать имя этого же файла?

Добрый день.
Недавно передали мне работу по загрузки реестров из банков в 1С. И вот с одним банком возникла проблема. приходит очень много реестров в формате txt, и причем за один день их может быть несколько одинаковых, например вот с таким именем (40104161) 6 файлов, благо почтовая программа при сохранении все файлов умеет дописывать в повторяющимся именам файлов счетчик и в результате я получаю вот такой набор файлов (40104161; 40104161(1); 40104161(2); 40104161(3) и т.д.). в самом файле в первой строке содержится имя файла, но у тех к которым добавлен счетчик в скобка оно не совпадает и 1С не принимает его, поэтому приходится вручную открывать каждый файл и переписывать первую строку.
Вопрос состоит в том как написать скрип который бы считывал имя файла и перезаписывал бы первую строку в самом файле?
  • Вопрос задан
  • 700 просмотров
Решения вопроса 1
skipirich
@skipirich
проходил мимо
Держи. Создай файл с этим кодом, положи его в папку со своими файлами и наслаждайся(ну или подправь путь с коде)
for f in listdir('.'):
    if not f.endswith('.py'):
        replace = f
        source = f.split('(')[0]
            
        file = open(f, 'r')
        text = file.read()
        file.close()

        file = open(f, 'w')
        file.write(text.replace(source, replace))
        file.close
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@res2001
Developer, ex-admin
Батником можно легко реализовать.
Вот набросок кода:
for %%a in (c:\temp\*) do (
 echo.%%~nxa - Это имя файла
 echo.Следующая команда выводит текстовый файл на экран, пропуская первую строку.
 for /f "usebackq tokens=* skip=1 delims=" %%b in ("%%~a") do echo.%%b
)

Идея должна быть понятна. Дальше уже сам доведешь до ума.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Единственный способ что-то подобное сделать с текстовым файлом — записать во временный файл, затем заменить этим временным старый. Так что будет что-то типа (пишу на псевдо-C++)
открыть исходный и временный файлы
if (std::getline(исходный, s)) {
  подкорректировать s
  временный << s << std::endl;
  while (std::getline(исходный, s) {
     временный << s << std::endl;
  }
  закрыть оба файла
  уничтожить исходный
  переименовать временный
}

Главная проблема — юникодные имена файлов, которых у вас, надеюсь, нет.
Ну и, разумеется, не забудьте про метку порядка байтов, если она в файлах есть.
Ответ написан
Комментировать
@abcd0x00
Ты бы скобки заменил на почёркивание 40104161(1) -> 40104161_1.
А потом переписал первую строку файла, скопировав в неё его имя.

Для этого нужно два скрипта (на питоне, шелле или чём): первый скрипт вот этот скобочный суффикс переданного ему файла заменяет на подчёркнутый суффикс; второй скрипт просто берёт файл и пишет в его первую строку его имя.

А над ними третий скрипт, который запускает для файла сначала первый скрипт, а потом второй.

И вот когда у тебя есть этот третий скрипт, ты его запускаешь в цикле для списка файлов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы