在文件中根据id号查询,id所在行的内容

Be_nurturing 2016-07-24 10:57:10
在一个上千万行的文件中,每行都有一个id号,也可能多行的id号是相同的,我现在想根据id号查询出对应行的内容(快速的查询出来),下图只是简单的例子说明
用一个程序结合哈希函数,或是数组,集合之类的知识实现,而不是考虑数据库的相关的内容。具体的实现可以不用代码写,会的朋友可以说以思路,谢谢
...全文
392 11 打赏 收藏 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Be_nurturing 2016-07-25
  • 打赏
  • 举报
回复
引用 10 楼 rickylin86 的回复:
[quote=引用 5 楼 Be_nurturing 的回复:] [quote=引用 3 楼 rickylin86 的回复:] 是存储在EXCEL里面吗?还是说普通的文档呢?EXCEL的话用POI API可以查询.普通文档的话可以参考Files.line(Path file)这个方法
就比如说是普通的文档,csv或是txt文档,但不是execle,这个肯定要用程序解决,不是软件的自带功能。还要请教一下思路[/quote] 可以考虑用类似如下代码.并不需要存储.而是直接在流中过滤.

//JDK 1.8及以后版本适用.
/*
data.bin文件内容格式:
123 你好,这是数据
456 hello,world.
jdl jfldjlfd
djf jdlfjaljf
123 fdjslfj;as
125 fdjlfjds
123 987746
*/

import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;

import java.nio.charset.Charset;

import java.util.stream.Stream;
import java.util.function.Predicate;


import java.io.IOException;

public class Test{
	public static void main(String[] args){
		Path path = Paths.get("data.bin");
		String id = "123";
		process(path,id);
	}

	private static void process(Path path,String id){
		try(Stream<String> contents = Files.lines(path,Charset.defaultCharset())){
			MyPredicate predicate = new MyPredicate(id);
			Stream<String> results = contents.filter(predicate);
			Object[] resultLines = results.toArray();
			for(Object line : resultLines){
				System.out.println(line);
			}
		}catch(IOException e){
			e.printStackTrace();
			System.exit(1);
		}
	}
}

class MyPredicate implements Predicate<String>{

	public MyPredicate(String id){
		idRegex = "^\\s*?\\Q" + id +"\\E\\s+.*$";
	}

	@Override
	public boolean test(String content){
		return content.matches(idRegex);
	}

	private String idRegex;
}
[/quote] 十分感谢这么晚还回帖子,想办法,我用的是jdk1.7的版本,觉得别人给我出的题目的是想用哈希,数组,集合,之类的知识,建立索引文件的东西,主要是考一下思路的问题。现在自己没有什么可行的思路。
rickylin86 2016-07-25
  • 打赏
  • 举报
回复
引用 5 楼 Be_nurturing 的回复:
[quote=引用 3 楼 rickylin86 的回复:] 是存储在EXCEL里面吗?还是说普通的文档呢?EXCEL的话用POI API可以查询.普通文档的话可以参考Files.line(Path file)这个方法
就比如说是普通的文档,csv或是txt文档,但不是execle,这个肯定要用程序解决,不是软件的自带功能。还要请教一下思路[/quote] 可以考虑用类似如下代码.并不需要存储.而是直接在流中过滤.

//JDK 1.8及以后版本适用.
/*
data.bin文件内容格式:
123 你好,这是数据
456 hello,world.
jdl jfldjlfd
djf jdlfjaljf
123 fdjslfj;as
125 fdjlfjds
123 987746
*/

import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;

import java.nio.charset.Charset;

import java.util.stream.Stream;
import java.util.function.Predicate;


import java.io.IOException;

public class Test{
	public static void main(String[] args){
		Path path = Paths.get("data.bin");
		String id = "123";
		process(path,id);
	}

	private static void process(Path path,String id){
		try(Stream<String> contents = Files.lines(path,Charset.defaultCharset())){
			MyPredicate predicate = new MyPredicate(id);
			Stream<String> results = contents.filter(predicate);
			Object[] resultLines = results.toArray();
			for(Object line : resultLines){
				System.out.println(line);
			}
		}catch(IOException e){
			e.printStackTrace();
			System.exit(1);
		}
	}
}

class MyPredicate implements Predicate<String>{

	public MyPredicate(String id){
		idRegex = "^\\s*?\\Q" + id +"\\E\\s+.*$";
	}

	@Override
	public boolean test(String content){
		return content.matches(idRegex);
	}

	private String idRegex;
}
叶旅魂途 2016-07-24
  • 打赏
  • 举报
回复
引用 8 楼 Be_nurturing 的回复:
[quote=引用 6 楼 adgjmptw1jw 的回复:]
提供一种高效率的方法,写一个树类,并且这颗树是可以进行序列化的,然后将这些数据放入这颗树中,接着将这棵树序列化成一个bytearray数组,然后将这个数组写入文件中就好了
提取的时候,读取文件中所有数据,反序列化为这个类,然后直接查询这棵树就好了


思路是好多的,可以说我对于树的概念一点都不了解,目前只学过哈希函数,数组,集合,之类的,对于树还是一窍不通的。[/quote]
会新建文件夹吧,会新建文件吧,那就用文件夹来模拟树型结构,比如编号为111,112,113 这三个id 的用户,首先新建一个名字为1的文件夹,在这个文件夹下面新建1个名字为1的文件夹,再再这个1号文件夹下面新建3个名字分别为1,2,3的文件夹,最后在这3个文件夹下面新建3个文件来存放这些数据,如图
这样的读取速度也是很快的,只不过对磁盘性能要求高点
Be_nurturing 2016-07-24
  • 打赏
  • 举报
回复
引用 6 楼 adgjmptw1jw 的回复:
提供一种高效率的方法,写一个树类,并且这颗树是可以进行序列化的,然后将这些数据放入这颗树中,接着将这棵树序列化成一个bytearray数组,然后将这个数组写入文件中就好了 提取的时候,读取文件中所有数据,反序列化为这个类,然后直接查询这棵树就好了
思路是好多的,可以说我对于树的概念一点都不了解,目前只学过哈希函数,数组,集合,之类的,对于树还是一窍不通的。
叶旅魂途 2016-07-24
  • 打赏
  • 举报
回复
引用 6 楼 adgjmptw1jw 的回复:
提供一种高效率的方法,写一个树类,并且这颗树是可以进行序列化的,然后将这些数据放入这颗树中,接着将这棵树序列化成一个bytearray数组,然后将这个数组写入文件中就好了 提取的时候,读取文件中所有数据,反序列化为这个类,然后直接查询这棵树就好了
你说到,数据量庞大的原因,那就把1开头的id 放入一颗树,2开头的id放入另外一颗树,3…………然后将这些树序列化成一个个的arraylist数组,然后存入不同的txt文件中,查询的时候如果是1开头,那就读取1号文件,就好了
叶旅魂途 2016-07-24
  • 打赏
  • 举报
回复
提供一种高效率的方法,写一个树类,并且这颗树是可以进行序列化的,然后将这些数据放入这颗树中,接着将这棵树序列化成一个bytearray数组,然后将这个数组写入文件中就好了 提取的时候,读取文件中所有数据,反序列化为这个类,然后直接查询这棵树就好了
Be_nurturing 2016-07-24
  • 打赏
  • 举报
回复
引用 3 楼 rickylin86 的回复:
是存储在EXCEL里面吗?还是说普通的文档呢?EXCEL的话用POI API可以查询.普通文档的话可以参考Files.line(Path file)这个方法
就比如说是普通的文档,csv或是txt文档,但不是execle,这个肯定要用程序解决,不是软件的自带功能。还要请教一下思路
Be_nurturing 2016-07-24
  • 打赏
  • 举报
回复
引用 2 楼 zhangweihan01 的回复:
提供一种方法(效率不高):考虑使用map存储和查询,id+自定义递增数字组成字符串做key,其余属性构成对象做vlaue,查询的时候使用keySet方法找到key对应的Set视图,遍历所有key,找出包含指定id字符串的key,最后得到value
这种方法估计内存不能支持因为是数据量比较大,都放在map中,内存情况要考虑下
rickylin86 2016-07-24
  • 打赏
  • 举报
回复
是存储在EXCEL里面吗?还是说普通的文档呢?EXCEL的话用POI API可以查询.普通文档的话可以参考Files.line(Path file)这个方法
zhangweihan01 2016-07-24
  • 打赏
  • 举报
回复
提供一种方法(效率不高):考虑使用map存储和查询,id+自定义递增数字组成字符串做key,其余属性构成对象做vlaue,查询的时候使用keySet方法找到key对应的Set视图,遍历所有key,找出包含指定id字符串的key,最后得到value
Be_nurturing 2016-07-24
  • 打赏
  • 举报
回复
求解,自己顶一下

51,407

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧