`
bobshute
  • 浏览: 284128 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分析日志并按分隔符分开保存

    博客分类:
  • j2se
J# 
阅读更多
/**
	 * 读取日志文件地址,每行根据指定字符分割开,每行分割成一个数组.每20000行(可传入参数指定,linesOnce)放到一个list中,
	 * 进行一个操作,然后list清空,重复下一个20000行(可传入参数指定,linesOnce)
	 * 注意:现在是把传入的参数取出来在检查一下,重新付给新的map当参数传入,如果传入的map中参数齐全,就可以直接传入的map参数往下传
	 * splitCharacter 分割用的字符,linesOnce为一次读取的行数,fileFrom需要分析的文件的地址和文件名,需要完整的路径和扩展名
	 * fileTo是文件复制到什么地方,如果为空则是在fileFrom同样的位置,文件名是在文件名的扩展名前面加上"_copy",如:E:\\text.txt,
	 * 则默认的fileTo为E:\\text_copy.txt.
	 * @param map
	 * @throws Exception 
	 */
	public static void readAndOperateLog(Map<String, String> map) throws Exception {

		String splitCharacter = ""; // 分隔符,如果没有默认为"-";
		String linesOnce = ""; // 一次读取多少行
		String fileFrom = "E:\\test.txt"; // 源文件地址,不能为空
		String fileTo = ""; // 源文件复制到地址.
		if (map != null) {
			splitCharacter = map.get("splitCharacter");
			linesOnce = map.get("linesOnce");
			fileFrom = map.get("fileFrom");
			fileTo = map.get("fileTo");
		}
		if (ifNull(splitCharacter)) {
			splitCharacter = "-";
		}
		if (ifNull(linesOnce)) {
			linesOnce = "20000";
		}
		if (ifNull(fileFrom)) {
			throw new Exception("源文件不能为空");
		}
		if (ifNull(fileTo)) {
			int indexDot = fileFrom.lastIndexOf(".");
			if (indexDot == -1) {
				throw new Exception("请输入完成的文件路径和名称,包括扩展名!");
			}
			fileTo = fileFrom.substring(0, indexDot) + "_copy" + fileFrom.substring(indexDot);
		}

		HashMap<String, String> mapAnlayze = new HashMap();
		mapAnlayze.put("splitCharacter", splitCharacter);
		mapAnlayze.put("linesOnce", linesOnce);
		mapAnlayze.put("fileFrom", fileFrom);
		mapAnlayze.put("fileTo", fileTo);

		List logInfo = logAnalyze(mapAnlayze); // 注意,如果 传入的map参数直接包含有这些参数,可以直接传入map即可
	}

	public static List logAnalyze(Map<String, String> map) {
		List logInfo = new ArrayList();
		String splitCharacter = ""; // 分割用的字符
		String linesOnce = ""; // 一次读取多少行
		String fileFrom = ""; // 源文件地址.
		String fileTo = ""; // 复制到文件地址.

		if (map != null) {
			splitCharacter = map.get("splitCharacter");
			linesOnce = map.get("linesOnce");
			fileFrom = map.get("fileFrom");
			fileTo = map.get("fileTo");
		}
		int linesOnceInt = Integer.parseInt(linesOnce);

		int lineread = 0; // 现在读到了那一行
		FileReader fr = null;
		try {
			HashMap<String, String> mapCopy = new HashMap();
			mapCopy.put("fileFrom", fileFrom);
			mapCopy.put("fileTo", fileTo);

			String copyFileInfo = copyFile(mapCopy); // copy 一份文件.如果
													 

			fr = new FileReader(fileTo);
			BufferedReader br = new BufferedReader(fr);
			String line;
			int listNum = 0;
			try {
				do {
					line = br.readLine();
					lineread++; // 假如linesOnceInt=2
					if (line == null) {
						break;
					}

					HashMap<String, String> mapOneLine = new HashMap<String, String>();
					mapOneLine.put("splitCharacter", splitCharacter);

					String[] oneLine = (String[]) operateOneLine(mapOneLine, line); // 对读入的一行进行操作

					logInfo.add(oneLine);

					if ((lineread % linesOnceInt) == 0) {
						// 在这里进行一些操作。
						// 在这里进行一些操作。
						listNum++;
						// 在这里可以打印出来查看结果.
						/*
						 * if (logInfo != null) {
							for (int i = 0; i < logInfo.size(); i++) {
								String[] logInfoOneLine = (String[]) logInfo.get(i);
								for (int j = 0; j < logInfoOneLine.length; j++) {
									System.out.println(listNum + "::第" + ((listNum - 1) * linesOnceInt + i) + "行,数组中的第" + j + "个数据的值为" + logInfoOneLine[j]);
								}
							}
						}
						*/
						logInfo.clear();
 //如果不清空,差不多60000行,占用内存10M
					}

				} while (line != null);

				br.close();
				fr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		return logInfo;
	}

	public static String copyFile(Map<String, String> map) {
		String errorInfo = "";
		String fileFrom = "";
		String fileTo = "";
		String copyWhere = ""; // 如果需要复制到指定地方或者
		if (map != null) {
			fileFrom = map.get("fileFrom");
			fileTo = map.get("fileTo");
		}

		if ("".equals(fileFrom)) { // 如果输入的复制源和复制地址为空,则提示返回信息 。
			errorInfo = "复制源文件路径和文件名为空!";
			return errorInfo;
		}

		if ("".equals(fileTo)) {
			errorInfo = "复制到文件路径和文件名为空!";
			return errorInfo;
		}

		FileInputStream fis = null;
		FileOutputStream fos = null;
		byte[] buff = new byte[1024];
		int readed = -1;

		try {
			try {
				fis = new FileInputStream(fileFrom);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
				errorInfo = "系统找不到指定文件!";
				return errorInfo;
			}
			try {
				fos = new FileOutputStream(fileTo);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
				errorInfo = "无法复制到指定地址!";
				return errorInfo;
			}

			try {
				while ((readed = fis.read(buff)) > 0)
					fos.write(buff, 0, readed);
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (fis != null) {
					fis.close();
				}
				if (fos != null) {
					fos.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return errorInfo;
	}

	public static String[] operateOneLine(Map<String, String> map, String line) {
		List oneline = new ArrayList();
		String splitCharacter = "";
		if (map != null) {
			splitCharacter = map.get("splitCharacter");
		}
		String[] splitCharacters = line.split(splitCharacter);
		/* 可以打印出来查看下.
		for (int i = 0; i < splitCharacters.length; i++) {
			// System.out.println(splitCharacters[i]);
		}
		*/

		return splitCharacters;
	}

	/**
	 * 判断输入的字符串是否为空,如果是则返回true,否则为false;
	 * @param str
	 * @return
	 */
	public static boolean ifNull(String str) {   
		if ("".equals(str) || str == null) {
			return true;
		} else {
			return false;
		}
0
0
分享到:
评论

相关推荐

    The-little-SAS-book(中文版).pdf

    SAS的导入过程可以用于读取分隔符文件,例如csv、txt、xls等文件格式。读者可以使用导入过程读取分隔符文件来快速读取和处理数据。 用 DDE读取 PC文件 SAS可以使用DDE(Dynamic Data Exchange)技术读取PC文件,...

    c#编写2的串口通讯工具

    程序自动识别这些分隔符,可以方便地将接收到的数据按行处理,这对于解析日志、命令响应等文本格式的数据十分有用。 实现这样的串口通信工具,首先需要创建`SerialPort`对象,然后配置串口参数,例如: ```csharp ...

    报文格式化程序.zip

    例如,串口数据通常由一系列连续的字节流组成,没有明确的行分隔符,这使得直接阅读和分析变得困难。 报文格式化就是将这些原始的、未结构化的报文转换成结构化的、易于理解的形式。这个过程通常包括以下几个步骤:...

    Db2 文件导入导出常见命令总结

    - 导入导出过程中可能出现错误,如格式不匹配、权限问题等,可以通过日志文件分析错误原因并进行调整。 - 在生产环境中,建议先在测试环境中验证导入导出命令,确保无误后再应用到生产系统。 总之,Db2 提供了...

    QT登录模块,登录时获取txt文件内账号密码进行判断,注册时写入到本地文件user.txt

    当用户提交这些信息时,程序会使用QFile和QTextStream逐行读取'user.txt'的内容,对每一行进行解析,通常每行包含一个账号和对应的密码,以某种分隔符(如逗号或冒号)分开。找到匹配的账号和密码后,登录过程就成功...

    Oracle 数据库备份与恢复总结.pdf

    - **将表中数据记录导出为字段值用分隔符'|'分开的dat文件**: 例如,使用`SELECT * FROM table_name INTO OUTFILE 'data.dat' FIELDS TERMINATED BY '|'`。 - **将数据导入到相应表中**: 使用SQL*Loader或直接的SQL ...

    Oracle数据库备份与恢复总结

    - **将表中数据记录导出为字段值用分隔符'|'分开的.dat文件**: ```sql spool data.dat; set linesize 1000; set pagesize 0; set feedback off; set heading off; set trimspool on; set colsep '|'; ...

    源码统计器1.1版(源码+软件)

    按第一种方式和第三种方式统计,代码行+注释行+空白行一定等于总行数,而第二种方式统计代码行+注释行+空白行大于总行数,两者之差就是既有代码又有注释符的行数。《源码统计器》缺省设置为第二种统计方法。 ...

    源码统计器v1.1

    按第一种方式和第三种方式统计,代码行+注释行+空白行一定等于总行数,而第二种方式统计代码行+注释行+空白行大于总行数,两者之差就是既有代码又有注释符的行数。《源码统计器》缺省设置为第二种统计方法。 &...

    rar压缩软件.rar

    switches=任何 RAR 开关,用空格分开 例如: switches=-m5 -s 环境变量 ~~~~~~~~ 可以通过建立"RAR"环境变量来添加默认参数到命令行中. 例如,在 Unix 中,下列命令行可以被添加到你的配置中: RAR='-s...

    WinRAR_4.0.exe

    switches=任何 RAR 开关,用空格分开 例如: switches=-m5 -s 环境变量 可以通过建立"RAR"环境变量来添加默认参数到命令行中. 例如,在 UNIX 中,下列命令行可以被添加到你的配置中: RAR='-s -md1024'...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    出处:风流的CG网络日志 时间:Mon, 28 Aug 2006 07:24:34 +0000 作者:yufeng 地址:http:///read.php?38 内容: 提供给新手学习的 PHP新手教程,是一个比较有价值的PHP新手教程! 一、PHP简介 PHP是一种易于...

Global site tag (gtag.js) - Google Analytics