`
RednaxelaFX
  • 浏览: 3019410 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

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

阅读更多
茶茶……以后这种工具自己写吧,那么简单……
这小程序就不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了……
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics