смещения файлов на окнах - PullRequest
0 голосов
/ 28 января 2009

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

У меня есть текстовый файл, добавленный к ночи, и я хотел бы сделать так, чтобы конец файла был отмечен, а затем, после добавления новых данных, обрабатывались только данные между смещением и концом. Я не могу сделать это только с помощью строк или разделителей, поскольку это данные BLOB-объектов.

edit: текстовый файл создается путем запуска макроса доступа ms из запланированных задач, который экспортирует данные в виде файла csv. Рассматривая предложение Патрика, я хотел бы знать, можно ли добавить подстановочный знак, такой как дата, к имени файла, чтобы всегда иметь другой файл. Этот файл будет затем scp'd на сервер Linux, где он будет загружен в базу данных MySQL.

Ответы [ 3 ]

2 голосов
/ 28 января 2009

Это просто с питоном:

import sys

def divide_file(fname, mark):
    mark_found = 0
    f = file(fname, 'r')
    for line in f.readlines():
        if mark in line:
            mark_found = 1
        if mark_found:
            print line.rstrip()
    f.close()

divide_file(sys.argv[1], sys.argv[2])

Пример использования и вывода:

c:\tmp>divide_file.py divide_file.py close
        f.close()

divide_file(sys.argv[1], sys.argv[2])
1 голос
/ 28 января 2009

Предполагается, что вы в настоящее время экспортируете данные из базы данных Access с помощью сценария уже:

@echo OFF

:: Force a new line and add a marker; assuming your file is data.txt.
@echo. >> data.txt
@echo **MARKER** >> data.txt

:: Run your export here: these lines just simulate the export.
@echo Test Line 1 >> data.txt
@echo Test Line 2 >> data.txt

:: Find line number of last marker:
for /f "usebackq delims=:" %%I in (`findstr /N "**MARKER**" data.txt`) do (
    set LAST_MARKER=%%I
)

:: Get all the lines after the last marker
for /f "skip=%LAST_MARKER% tokens=*" %%L in (data.txt) do (
    @echo %%L >> new_data.txt
)

Выход в new_data.txt будет:

Тестовая линия 1
Тестовая линия 2

1 голос
/ 28 января 2009

Я мог бы подумать о tail , bash и других утилитах из Unix-подобных систем. Вы можете получить их в Windows, минимально установив MSYS . Документация и примеры, относящиеся к этим утилитам, довольно легко найти. И bash намного сильнее, чем командные файлы Windows. Сценарий будет выглядеть примерно так:

#!/bin/bash

PREV_SIZE=`du -b text_file`
write_something_to_file text_file
CURR_SIZE=`du -b text_file`
let NUM=$PREV_SIZE-$CURR_SIZE
tail -c $NUM > new_text_file
...