2012-06-15 3 views
4

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

field1  field2   field3 
AAAAA  BBBBB   CCCCC 
DDDDD      EEEEE 
FFFFF       
GGGGG  HHHHH 

мне нужно вставьте строку «NULL» в каждое пустое поле и обязательно, что поле 1 не пустое и поле 2,3 где-то будет пустым. Кроме того, пространство между field1 & field2 отличаются от FIELD2 & поля 3

output.txt

field1  field2   field3 
AAAAA  BBBBB   CCCCC 
DDDDD  NULL    EEEEE 
FFFFF  NULL    NULL  
GGGGG  HHHHH   NULL 

Потому что я все еще нужен сценарии пакетного файла .. я попробовать написать код (поле 2 всегда начинается с 12 символа слева и поле 3 всегда 29 символов слева)

@echo off 

set line= 
for /F in (input.txt)do 
if "!line:~12" equ " " 
write "NULL" >> (i am not sure whether this work) 

if "!line:~29" equ " " 
write "NULL" 

echo .>> output.txt 

Возможно, кто-то может исправить м Я ошибаюсь? спасибо !!

+0

На каком языке это? –

+0

- это скрипт окна, DOS. – cheeseng

ответ

1

Как и было обещано, вот решение в Python. Эта программа будет работать отлично с Python 3.x или с Python 2.7. Если вы очень новичок в программировании, я предлагаю Python 3.x, потому что я думаю, что его легче освоить. Вы можете получить Python бесплатно отсюда: http://python.org/download/

Последняя версия Python - версия 3.2.3; Я предлагаю вам это получить.

Сохранить код Python в файле с именем add_null.py и запустить его с помощью команды:

python add_null.py input_file.txt output_file.txt 

кода с большим количеством комментариев:

# import brings in "modules" which contain extra code we can use. 
# The "sys" module has useful system stuff, including the way we can get 
# command-line arguments. 
import sys 

# sys.argv is an array of command-line arguments. We expect 3 arguments: 
# the name of this program (which we don't care about), the input file 
# name, and the output file name. 
if len(sys.argv) != 3: 
    # If we didn't get the right number of arguments, print a message and exit. 
    print("Usage: python add_null.py <input_file> <output_file>") 
    sys.exit(1) 

# Unpack the arguments into variables. Use '_' for any argument we don't 
# care about. 
_, input_file, output_file = sys.argv 


# Define a function we will use later. It takes two arguments, a string 
# and a width. 
def s_padded(s, width): 
    if len(s) >= width: 
     # if it is already wide enough, return it unchanged 
     return s 
    # Not wide enough! Figure out how many spaces we need to pad it. 
    len_padding = width - len(s) 
    # Return string with spaces appended. Use the Python "string repetition" 
    # feature to repeat a single space, len_padding times. 
    return s + ' ' * len_padding 


# These are the column numbers we will use for splitting, plus a width. 
# Numbers put together like this, in parentheses and separated by commas, 
# are called "tuples" in Python. These tuples are: (low, high, width) 
# The low and high numbers will be used for ranges, where we do use the 
# low number but we stop just before the high number. So the first pair 
# will get column 0 through column 11, but will not actually get column 12. 
# We use 999 to mean "the end of the line"; if the line is too short, it will 
# not be an error. In Python "slicing", if the full slice can't be done, you 
# just get however much can be done. 
# 
# If you want to cut off the end of lines that are too long, change 999 to 
# the maximum length you want the line ever to have. Longer than 
# that will be chopped short by the "slicing". 
# 
# So, this tells the program where the start and end of each column is, and 
# the expected width of the column. For the last column, the width is 0, 
# so if the last column is a bit short no padding will be added. If you want 
# to make sure that the lines are all exactly the same length, change the 
# 0 to the width you want for the last column. 
columns = [ (0, 12, 12), (12, 29, 17), (29, 999, 0) ] 
num_columns = len(columns) 

# Open input and output files in text mode. 
# Use a "with" statement, which will close the files when we are done. 
with open(input_file, "rt") as in_f, open(output_file, "wt") as out_f: 
    # read the first line that has the field headings 
    line = in_f.readline() 
    # write that line to the output, unchanged 
    out_f.write(line) 

    # now handle each input line from input file, one at a time 
    for line in in_f: 
     # strip off only the line ending 
     line = line.rstrip('\n') 

     # start with an empty output line string, and append to it 
     output_line = '' 
     # handle each column in turn 
     for i in range(num_columns): 
      # unpack the tuple into convenient variables 
      low, high, width = columns[i] 
      # use "slicing" to get the columns we want 
      field = line[low:high] 
      # Strip removes spaces and tabs; check to see if anything is left. 
      if not field.strip(): 
       # Nothing was left after spaces removed, so put "NULL". 
       field = "NULL" 

      # Append field to output_line. field is either the original 
      # field, unchanged, or else it is a "NULL". Either way, 
      # append it. Make sure it is the right width. 
      output_line += s_padded(field, width) 

     # Add a line ending to the output line. 
     output_line += "\n" 
     # Write the output line to the output file. 
     out_f.write(output_line) 

Результат выполнения этой программы:

field1  field2   field3 
AAAAA  BBBBB   CCCCC 
DDDDD  NULL    EEEEE 
FFFFF  NULL    NULL 
GGGGG  HHHHH   NULL 
+0

Привет, Stevaha, Большое вам спасибо. Ваше решение действительно полезно !!! – cheeseng

+0

Я рад, что он работает на вас! :-) Python намного проще, чем «пакетный» язык Microsoft, так что это тоже лучше для будущего. – steveha

+0

hi Stevaha, yup, я тоже постараюсь забрать этот язык. Обычно моя работа связана с сценарием пакетного файла, поэтому мне нужно вызвать файл python в командном файле cmd. как вы вызываете пакетный файл? если нет, как его автоматизировать? Если сценарий он прочитал папку для каждого файла с .txt формате addnull.py , я стараюсь Google это, но еще не совсем понимаю .. – cheeseng

0

Я не думал, что вы хотели сделать, возможно в Microsoft «пакетных» сценариев. Но есть полный набор строковых операторов документированных здесь:

http://www.dostips.com/DtTipsStringManipulation.php

Но командные файлы ужасны, и я надеюсь, что вы можете использовать что-то лучше. Если вы хотите использовать Python-решение или AWK, я могу вам помочь.

Если бы я тебя, и я действительно собирался сделать это в «партии» были, я бы разбить каждую линию на три подстроки, используя ~x,y колонок нарезки (где x является первыми колонками и y является вторым). Затем проверьте, есть ли каждый из них просто пробелы, а для тех, которые являются просто пробелами, замените на «NULL». Затем верните подстроки обратно в одну строку и напечатайте это. Сделайте это внутри цикла, и у вас есть ваша программа.

+0

Привет, Stevaha, Спасибо за предложение .. Я не очень хорошо знаком с Python, если использовать python, он может быть запущен в качестве задачи расписания в окне? На самом деле я тоже думаю, используя vbscript, но из-за того, что я новичок в кодировании .. любое предложение приветствую !!! надеюсь, ты сможешь помочь мне в этом. – cheeseng

+0

Я не знаю VBScript, но там будут другие люди на StackOverflow, которые это знают. Python не входит в стандартную комплектацию Windows, поэтому вам придется его устанавливать. Если VBScript более стандартен в вашей работе, вы можете использовать его. Но если вы установили Python, тогда вы можете запустить его как запланированную задачу. – steveha

+0

Привет, Stevaha, Спасибо, я бы попробовал установить python first .. и изучить новый метод кодирования. Не могли бы вы показать мне, как использовать python для развертывания этой задачи? Объяснение того, как работает ваш код, поскольку я не знаком с python ... :) – cheeseng