茶茶……以后这种工具自己写吧,那么简单……
这小程序就不refactor了……||| 本来应该把那些error code给封装到Line里的,懒得改了 :-p
会有点小bug,例如说如果有过多的逗号的话,可能会少检查到一些错误。不过那行本身还是会本认为是错误,所以我觉得没啥。
本来想用Ruby写的,不过想来你没装Ruby,算了还是Java吧
测试文本:
引用
12345678,12,我是测试文本
23456789,0,
01234567,20,上面是空行测试
2345abcd,40,下面测试一个错误的地址
0 12345,10,这行的地址是错的
12345678,6,测试12345
12345678,4,上一行有半角字符,而这行过长
01234567,x,这行的长度出错了
执行命令及显示结果:
D:\>java SanityCheck text.txt
发现错误,记录到文件text.txt.err.log
错误记录文件内容:
引用
第5行,地址不是合法的十六进制数字
0 12345,10,这行的地址是错的
第6行,文本存在半角字符,文本长度超过最大长度
12345678,6,测试12345
第7行,过多逗号,文本长度超过最大长度
12345678,4,上一行有半角字符,而这行过长
第8行,最大长度不是合法的十进制数字
01234567,x,这行的长度出错了
批量处理时使用命令:
引用
for %f in (*.txt) do java SanityCheck %f
程序代码:
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了……
分享到:
相关推荐
文本校验工具 很实用 很小巧 谁用谁知道
用来学习正则表达式的小工具(JAVA版的) 可以及时的测试自己写的正则表达式 Welcome to id0096.cn
游戏文件完整性校验工具游戏文件完整性校验工具游戏文件完整性校验工具
十六进制加和校验工具十六进制加和校验工具十六进制加和校验工具
文件校验工具 MD5 校验王中文版文件校验工具 MD5 校验王中文版 MD5 校验王可以对任意文件进行版本,文件时间,MD5值,SHA1值,CRC32值的校验。 计算选项: 版本:当选择校验文件为exe或者dll文件时,在运算结果中...
累加和校验、异域和校验工具、CRC16校验、CRC32校验,挺好的,非常好用的小工具,可以使用这个工具进行校验
CRC校验、累加和校验、异或和校验专业校验工具,智能提醒!
SHA256校验的小工具 可以检查文件是否改动
这是自己开发的一个参数校验的工具类,可用于对实例的属性进行非空校验。包括全部校验和任一校验两种校验方式。 举例:CheckParamsUtils.checkParamsAll(requestBean, "name", "age","gender");
ECC算法校验工具ECC算法校验工具ECC算法校验工具
jsonedit格式化 校验工具 离线工具安装包,小插件 开发工具 windows环境下安装,适合于没有网开发的程序员 工程师使用,亲测可用
本工具支持常用的所有CRC校验 比如: CRC-4/TU CRC-5/EPC CRC-5/ITU CRC-6/TU CRC-7/MMC CRC-8 CRC-8/ITU CRC-8/ROHC CRC-8/MAXIM CRC-16/BM CRC-16/MAXIM CRC-16/USB CRC-16/MODBUS CRC-16/CCITT CRC-16/CCITT-...
md5生成及校验工具,md5生成及校验工具,md5生成及校验工具
Hash md5校验工具 是一款小巧好用的哈希计算器 Hash也是一款md5校验工具 Hash支持文件拖放 速度很快 可以计算文件的 MD5 SHA1 CRC32 的值 软件特色: 支持多个文件或文件夹拖放操作; 支持参数启动 参数为一个...
整理的校验值计算工具(包括异或+CRC+和校验)
采用机器语言编译的校验算法,校验2G的文件小于1秒。中文代码,很容易看懂
MD5校验工具 MD5校验工具 MD5校验工具
NMEA协议是为了在不同的GPS导航设备中建立统一的...GPS协议校验和计算工具就是计算此校验和的小工具,可以输入$和*之间的字符串,也可以输入$开头的字符串,也可以输入以*结尾的字符串,工具都能自动识别,并正确计算。
文件校验工具.zip文件校验工具.zip文件校验工具.zip文件校验工具.zip文件校验工具.zip
MD5值校验工具,无需安装,直接使用,校验文件 MD5值。 MD5值校验工具 3.0