`
RednaxelaFX
  • 浏览: 3052658 次
  • 性别: 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了……
分享到:
评论

相关推荐

    文本校验工具

    文本校验工具 很实用 很小巧 谁用谁知道

    游戏文件完整性校验工具

    游戏文件完整性校验工具是一种用于确保游戏数据完整无损的应用程序。它主要通过对比游戏安装目录中的文件与预设的校验值(如MD5、SHA1或CRC32)来检测文件是否丢失、损坏或者被篡改。这对于解决游戏运行错误、性能...

    Java 正则表达式 验证 工具 0.1

    用来学习正则表达式的小工具(JAVA版的) 可以及时的测试自己写的正则表达式 Welcome to id0096.cn

    十六进制加和校验工具

    十六进制加和校验工具十六进制加和校验工具十六进制加和校验工具

    ISO文件校验工具

    标题中的“ISO文件校验工具”指的是用于验证ISO镜像文件完整性的软件。ISO文件是一种标准的光盘映像格式,常用来存储操作系统、应用程序或数据的完整副本,以便刻录到光盘或虚拟化。在下载这些大型文件时,由于网络...

    文件校验工具 MD5 校验王 5.9.8.0 绿色中文免费版.zip

    文件校验工具 MD5 校验王中文版文件校验工具 MD5 校验王中文版 MD5 校验王可以对任意文件进行版本,文件时间,MD5值,SHA1值,CRC32值的校验。 计算选项: 版本:当选择校验文件为exe或者dll文件时,在运算结果中...

    累加和校验,异域和校验工具

    总的来说,这些校验工具是IT专业人士日常工作中不可或缺的辅助手段,它们帮助我们确保数据的正确性,防止因传输错误或硬件故障导致的数据丢失或损坏。理解并正确使用这些校验方法,对于保障系统稳定运行和数据安全至...

    CRC32校验工具

    CRC32校验工具是一种广泛应用于数据完整性和错误检测的技术,尤其在文件传输、存储系统以及通信协议中占据重要地位。CRC,全称是Cyclic Redundancy Check(循环冗余校验),它通过计算数据的校验码来判断数据在传输...

    校验值计算工具(异或+CRC+和校验)

    整理的校验值计算工具(包括异或+CRC+和校验)其中包括多款校验工具,多款CRC校验工具,包括多种方式,异或检验工具及和校验工具,满足日常数据帧的各种校验方式,已使用360杀毒扫描,无病毒。

    CheckTool:CRC校验、累加和校验、异或和校验专业校验工具V1.0

    CheckTool V1.0是一款专门针对这些校验方法的专业工具,它能够帮助用户快速、准确地检测数据的完整性,从而避免因数据错误导致的问题。 CRC校验,全称为循环冗余校验,是一种广泛应用于网络通信、存储系统和软件...

    异或校验工具XOR.zip

    这个名为“XOR.zip”的压缩包包含了一个异或校验工具,该工具能够帮助用户快速计算16进制字符串的异或校验码。这里我们将深入探讨异或运算以及如何使用它来进行校验。 异或(XOR,exclusive OR)是一种逻辑运算符,...

    十六进制字符串按位异或校验和和校验工具

    十六进制字符串按位异或校验和校验工具是一种在数据通信和计算机科学中广泛使用的错误检测方法。它的核心原理是基于异或(XOR)运算的特性来计算数据的校验和,以验证数据在传输过程中是否发生错误。下面我们将深入...

    文件/文本及文件夹的校验工具

    文件/文本及文件夹的校验工具是用来生成并验证数据的一种实用程序,它们通常能够计算出文件或文本的哈希值,如SHA(Secure Hash Algorithm)和MD5(Message-Digest Algorithm 5)。这些算法为数据提供了独特的数字...

    ECC算法校验工具---ECC开发

    ECC算法校验工具ECC算法校验工具ECC算法校验工具

    SHA256校验工具

    SHA256校验的小工具 可以检查文件是否改动

    XML校验工具,可以用来进行XML合法性检验

    ### XML校验工具详解 #### 一、XML与W3C简介 - **XML(Extensible Markup Language)**:一种标记语言,旨在定义一套规则,用于结构化文档中数据的存储和传输。XML的设计目标是尽可能地保持数据的原始性和纯粹性,...

    Java校验参数工具类

    这是自己开发的一个参数校验的工具类,可用于对实例的属性进行非空校验。包括全部校验和任一校验两种校验方式。 举例:CheckParamsUtils.checkParamsAll(requestBean, "name", "age","gender");

    BCC check 校验工具

    **标题解析:** "BCC check 校验工具" 是一个专门用于进行BCC(Block Check Character)校验的软件工具。它旨在确保在不同设备间传输的数据的完整性和准确性,尤其是在通信过程中可能出现错误的情况下。 **BCC校验...

    求加和校验累加和校验小工具

    在具体实现中,个人制作的小工具“求加和校验小工具by lixiaodaoaaa”可能包含以下功能: 1. 单个数据的加和计算:用户可以输入一组数据,工具会快速计算出其加和值,用于基本的错误检测。 2. 数据集的累加和计算:...

    邮箱地址校验工具

    邮箱地址校验工具是一种用于验证电子邮件地址真实性和有效性的实用程序。在互联网环境中,正确有效的邮箱地址对于发送营销邮件、用户注册验证、客户服务等业务至关重要。这类工具的主要目标是防止无效或错误的邮箱...

Global site tag (gtag.js) - Google Analytics