2009-01-28 8 views
0

Existe-t-il un moyen facile, de préférence avec un langage de script ou un petit outil qui pourrait être appelé à travers un fichier batch, de travailler sur un fichier texte, de marquer un offset et de placer tout ce qui suit? nouveau fichier?Décalages de fichiers sur Windows

J'ai un fichier texte ajouté à nightly, et je voudrais faire en sorte que la fin du fichier est marqué, puis après l'ajout de nouvelles données, seules les données entre le décalage et la fin est traitée. Je ne peux pas le faire avec juste des chaînes ou des délimiteurs car ce sont des données BLOB.

edit: Le fichier texte est créé en exécutant une macro d'accès ms à partir d'une tâche planifiée, qui exporte les données en tant que fichier csv. En considérant la suggestion de Patrick, j'aimerais savoir s'il serait possible d'ajouter un caractère générique comme la date au nom de fichier, pour toujours avoir un fichier différent. Ce fichier sera ensuite scp'd vers un serveur Linux, où il sera chargé dans une base de données mysql.

+0

Pouvez-vous horodater les enregistrements dans le fichier? Pourriez-vous donner un bref exemple de votre question? –

+0

Ce sont les données exportées d'une base de données d'accès, y compris certaines données binaires. Il n'y a pas de champ de date et je ne peux pas modifier la base de données d'accès pour en avoir une –

+0

Je recommande de modifier votre question pour décrire votre processus, et la base de données Access, et le marquer avec ms-access; vous obtiendrez une meilleure visibilité et peut-être plus de réponses. –

Répondre

1

En supposant que vous exportez actuellement les données de la base de données Access avec un script déjà:

@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 
) 

La sortie en new_data.txt sera:

ligne test 1
test Line 2

+0

J'utilise une macro dans l'accès qui est exécuté à partir de la ligne de commande, serait-ce facile à faire avec une macro? –

+0

Votre question posée "Y at-il un moyen facile, de préférence avec un langage de script ou un petit outil qui pourrait être appelé à travers un fichier batch" ... –

+0

Je dois demander; pourquoi ne pas simplement mettre les données qui viendraient après le marqueur dans son propre fichier? –

2

Il est simple avec python:

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]) 

Utilisation & exemple de sortie:

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

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

Merci pour votre réponse, mais python n'est pas une possibilité pour cette instance. –

1

je pourrais penser à queue, bash et d'autres utilitaires de systèmes Unix. Vous pouvez obtenir ceux sur Windows en installant au minimum MSYS. La documentation et les exemples se référant à ces utilitaires sont assez faciles à trouver. Et bash choses est beaucoup plus forte que les fichiers batch Windows. Le script ressemblerait à quelque chose comme ceci:

#!/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 
Questions connexes