我想用批处理文件插入一个字符串来替换特定列中的空白区域 假设我有一个 input.txt 如下所示
field1 field2 field3
AAAAA BBBBB CCCCC
DDDDD EEEEE
FFFFF
GGGGG HHHHH
我需要在每个空字段上插入一个字符串“NULL”,并确保字段 1 不为空并且 field 2,3 有时会为空。另外,field1 &field2 和field2 & field 3 之间的空格是不一样的
输出.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
也许,有人可以纠正我的错误吗? 谢谢!!
最佳答案
正如所 promise 的,这是 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
关于windows - 使用批处理文件插入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11043742/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我