[茶] 那个文本校验工具,ver0.1

茶茶……以后这种工具自己写吧,那么简单……
这小程序就不refactor了……||| 本来应该把那些error code给封装到Line里的,懒得改了 :-p
会有点小bug,例如说如果有过多的逗号的话,可能会少检查到一些错误。不过那行本身还是会本认为是错误,所以我觉得没啥。
本来想用Ruby写的,不过想来你没装Ruby,算了还是Java吧

测试文本:
[quote]12345678,12,我是测试文本
23456789,0,
01234567,20,上面是空行测试
2345abcd,40,下面测试一个错误的地址
0 12345,10,这行的地址是错的
12345678,6,测试12345
12345678,4,上一行有半角字符,而这行过长
01234567,x,这行的长度出错了
[/quote]

执行命令及显示结果:
[code]D:\>java SanityCheck text.txt
发现错误,记录到文件text.txt.err.log[/code]

错误记录文件内容:
[quote]第5行,地址不是合法的十六进制数字
0 12345,10,这行的地址是错的

第6行,文本存在半角字符,文本长度超过最大长度
12345678,6,测试12345

第7行,过多逗号,文本长度超过最大长度
12345678,4,上一行有半角字符,而这行过长

第8行,最大长度不是合法的十进制数字
01234567,x,这行的长度出错了[/quote]

批量处理时使用命令:
[quote]for %f in (*.txt) do java SanityCheck %f[/quote]

程序代码:
SanityCheck.java:
import java.io.*;
import java.util.*;

public class SanityCheck {
private static final String usage = "使用方法: java SanityCheck 待校验文件名";

public static void main(String[] args)
throws Exception {
// check argument
if (1 != args.length) {
System.err.println("参数错误");
System.err.println(usage);
return;
}

File inFile = new File(args[0]);
if (!inFile.exists()) {
System.err.println("指定的文件不存在");
System.err.println(usage);
return;
}

BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(inFile)));

// do sanity check
ArrayList<Line> errors = sanityCheck(reader);
reader.close();

if (0 == errors.size()) {
System.out.println("没有错误");
} else {
String outFileName = args[0] + ".err.log";

System.out.print("发现错误,记录到文件");
System.out.println(outFileName);

PrintWriter writer = new PrintWriter(
new OutputStreamWriter(
new FileOutputStream(outFileName)));
for (Line line : errors) {
writer.println(line.errorMessage);
writer.println(line.text);
writer.println();
}
writer.flush();
writer.close();
}
}

private static class Line {
int lineNum;
String text;
String errorMessage;
}

private static final int ERROR_ADDRESS = (1 << 0);
private static final int ERROR_LENGTH = (1 << 1);
private static final int ERROR_OVER_LENGTH = (1 << 2);
private static final int ERROR_HALFWIDTH = (1 << 3);
private static final int ERROR_MISSING_COMMA = (1 << 4);
private static final int ERROR_TOO_MANY_COMMA = (1 << 5);
private static final int ERROR_UNKNOWN = (1 << 30);

private static ArrayList<Line> sanityCheck(BufferedReader reader)
throws IOException {
String input = reader.readLine();
int lineNum = 0;
int errorFlag = 0;
ArrayList<Line> errorLog = new ArrayList<Line>();

while (null != input) {
// initialize
++lineNum;
errorFlag = 0;

String[] seg = input.split(",", -1);
if (3 > seg.length) errorFlag |= ERROR_MISSING_COMMA;
else {
if (3 < seg.length) errorFlag |= ERROR_TOO_MANY_COMMA;

// check first segment, address
if (!seg[0].matches("[0-9a-fA-F]{8}")) errorFlag |= ERROR_ADDRESS;

// check second segment, maximum length
if (!seg[1].matches("^[0-9]+[02468]$")) errorFlag |= ERROR_LENGTH;

// check third segment, text
int length = seg[2].length();
for (int i = 0; i < length; ++i) {
int codePoint = seg[2].codePointAt(i);
if (codePoint >= 0x20 && codePoint <= 0x7F) {
errorFlag |= ERROR_HALFWIDTH;
break;
}
}

// check length
if (0 == (errorFlag & ERROR_LENGTH)) {
int maxLength = Integer.parseInt(seg[1]) / 2;
if (length > maxLength) errorFlag |= ERROR_OVER_LENGTH;
}
}

// log the erroronus line
if (0 != errorFlag) {
StringBuilder builder = new StringBuilder();
builder.append("第");
builder.append(lineNum);
builder.append("行");
if (0 != (errorFlag & ERROR_MISSING_COMMA))
builder.append(",缺少逗号");
if (0 != (errorFlag & ERROR_TOO_MANY_COMMA))
builder.append(",过多逗号");
if (0 != (errorFlag & ERROR_ADDRESS))
builder.append(",地址不是合法的十六进制数字");
if (0 != (errorFlag & ERROR_LENGTH))
builder.append(",最大长度不是合法的十进制数字");
if (0 != (errorFlag & ERROR_HALFWIDTH))
builder.append(",文本存在半角字符");
if (0 != (errorFlag & ERROR_OVER_LENGTH))
builder.append(",文本长度超过最大长度");

Line errorLine = new Line();
errorLine.lineNum = lineNum;
errorLine.text = input;
errorLine.errorMessage = builder.toString();

errorLog.add(errorLine);
}

// re-initialize
input = reader.readLine();
}

return errorLog;
}
}


更新:忘了,第二段的长度是按字节算的,我忘记除以2了……
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值