如何通过java过滤文本文件并将结果保存到新文件中

Posted

技术标签:

【中文标题】如何通过java过滤文本文件并将结果保存到新文件中【英文标题】:How to filter text file and save the result to the new file by java 【发布时间】:2019-06-20 14:56:15 【问题描述】:

您好,我的问题是如何按列过滤文本文件,我的意思是我想从行之间的范围内剪切文件。 我的文件包含这种数据:

284015160747447;8935901990807474474; 284015160747448;8935901990807474482; 284015160747449;8935901990807474490; 284015160747450;8935901990807474508; 284015160747451;8935901990807474516; 284015160747452;8935901990807474524; 284015160747453;8935901990807474532; 284015160747454;8935901990807474540; 284015160747455;8935901990807474557; 284015160747456;8935901990807474565; 284015160747457;8935901990807474573; 284015160747458;8935901990807474581; 284015160747459;8935901990807474599; 284015160747460;8935901990807474607; 284015160747461;8935901990807474615; 284015160747462;8935901990807474623; 284015160747463;8935901990807474631;

我希望用户能够将要写入的内容从原始文件过滤到新创建的文件中: 例如从 8935901990807474490 到 8935901990807474532,对于这个数字,起始行和最后一行都在这个范围内。

public class Test_read_file 
    public static List<String> readFile() throws IOException 
        try (BufferedReader br = new BufferedReader(new FileReader("C:\\\\\\\\Users\\\\\\\\Admin\\\\\\\\Desktop\\\\\\\\Work Files\\\\\\\\314-WO0000001133814\\\\\\\\Cards\\\\\\\\MBD10760_182.out"))) 
            List<String> listOfData = new ArrayList<>();
            String d;
            while ((d = br.readLine()) != null) 
                listOfData.add(d);
            
            return listOfData;
        
    

    public static void writeFile(List<String> listOfData) throws IOException 
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\\\\\\\Users\\\\\\\\Admin\\\\\\\\Desktop\\\\\\\\Work Files\\\\\\\\314-WO0000001133814\\\\\\\\Cards\\\\\\\\MBD10760_187.out"))) 
            for (String str : listOfData) 
                bw.write(str);
                bw.newLine();
            
        
    

    public static void main(String[] args) throws IOException 
        List<String> data = readFile();
        writeFile(data);
    

【问题讨论】:

你能详细说明一下这些列的含义吗?示例文件是否每行显示一行?还是只是一个长字符串? 是的,它显示了文本文件,它包含两列,第一列:284015160747447 和第二列 8935901990807474474 用 ; 分隔。我成功读取和写入文件,但我想通过第二列和过滤器过滤文本文件某个范围之间的所有数据,例如从 8935901990807474490 到 8935901990807474532 写入新文件中两条记录之间的所有行 所以每行包含4个数字?还假设范围是从2840151607474478935901990807474482,这是否意味着您要写以下数字? - 284015160747447;8935901990807474474; 284015160747448;8935901990807474482; 这是一行:284015160747447;8935901990807474474。我不会从第二列 8935901990807474474 中过滤并保存给定范围之间的整个记录​​ 所以您只想将出现在第二列中的数字写入给定范围的文件?同时提供一个示例输出。 【参考方案1】:

对您的代码进行以下更改:

    使用 Scanner 接受要过滤的值:

    public static void main(String[] args) throws IOException 
        List<String> data = readFile();         
        Scanner sc = new Scanner(System.in);        
        System.out.println("Enter range");      
        long num1 = sc.nextLong();      
        long num2 = sc.nextLong();      
        writeFile(data, num1, num2);
        sc.close();     
    
    

    由于您只希望第二列写入列,因此将其拆分 使用;,然后只将第一个索引添加到列表中。这确保只有第二列的数字被添加到列表中。

    public static List<String> readFile() throws IOException       
        try (BufferedReader br = new BufferedReader(new FileReader(PATH))) 
            List<String> listOfData = new ArrayList<>();            
            String d;
            while ((d = br.readLine()) != null) 
                String[] split = d.split(";");  // <-- change made here
                listOfData.add(split[1]);           
                       
            return listOfData;      
           
    
    

    使用传入的范围,它将只写入下降的数字 在这个范围内。

    public static void writeFile(List<String> listOfData, long num1, long num2) 
       throws IOException 
       try (BufferedWriter bw = new BufferedWriter(new FileWriter(OUT)))           
            for (String str : listOfData) 
                // change made here
                if (Long.valueOf(str) >= num1 && Long.valueOf(str) <= num2) 
                    bw.write(str);
                    bw.newLine();
                           
                   
           
    
    

【讨论】:

以上是关于如何通过java过滤文本文件并将结果保存到新文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何通过不同的 csv 文件迭代选择的操作并将结果输出到新的 csv 文件

如何将变量保存到新的文本文件中,以便下次程序运行时加载这些变量?

如何在 java Servlet 过滤器中更改传入 URL 并将请求重定向到新 URL [重复]

无法将条件结果附加到新列表

Python:读取文本文件并将其中列出的目录复制/粘贴到新目录

创建新文件夹并将 SHEET1 保存到新文件夹