为了账号安全,请及时绑定邮箱和手机立即绑定

使用缓冲阅读器读取没有换行符的文件

使用缓冲阅读器读取没有换行符的文件

繁花不似锦 2022-06-15 10:10:39
我正在读取一个带有逗号分隔值的文件,当拆分为一个数组时,每行将有 10 个值。我希望文件有换行符,这样line = bReader.readLine()会给我每一行。但是我的文件没有换行符。相反,在第一组值之后有很多空格(准确地说是 465),然后下一行开始。所以我上面的 readLine() 代码是一次性读取整个文件,因为没有换行符。请建议如何最好地有效地解决这种情况。
查看完整描述

4 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

一种方法是在迭代读取之前用换行符“\n”替换文本中的 465 个空格。



查看完整回答
反对 回复 2022-06-15
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

我支持 Ninan 的回答:用换行符替换 465 个空格,然后运行您之前计划运行的功能。


为了美观和可读性,我建议使用 Regex 的 Pattern 来替换空格而不是 long unreadable String.replace("                         ")。


您的代码可能如下所示,但将 6 替换为 465:


 // arguments are passed using the text field below this editor

  public static void main(String[] args)

  {

    String content = "DOG,CAT      MOUSE,CHEESE";

    Pattern p = Pattern.compile("[ ]{6}",

            Pattern.DOTALL | Pattern.CASE_INSENSITIVE);

    String newString = p.matcher(content).replaceAll("\n");

    System.out.println(newString); 

  }


查看完整回答
反对 回复 2022-06-15
?
月关宝盒

TA贡献1772条经验 获得超5个赞

我的理解是你有一个没有正确换行符的平面 CSV 文件,每行应该有 10 个值。


更新:1.(推荐)假设您尝试存储一行中的 10 个值,您可以使用带有 useDelimiter 的 Scanner 类来有效地解析 csv:


    public static void parseCsvWithScanner() throws IOException {


    Scanner scanner = new Scanner(new File("test.csv"));


    // set your delimiter for scanner, "," for csv

    scanner.useDelimiter(",");


    // storing 10 values as a "line"

    int LINE_LIMIT = 10;


    // implement your own data structure to store each value of CSV

    int[] tempLineArray = new int[LINE_LIMIT];


    int lineBreakCount = 0;


    while(scanner.hasNext()) {


        // trim start and end spaces if there is any

        String temp = scanner.next().trim();

        tempLineArray[lineBreakCount++] = Integer.parseInt(temp);


        if (lineBreakCount == LINE_LIMIT) {


            // replace your own logic for handling the full array

            for(int i=0; i<tempLineArray.length; i++) {

                System.out.print(tempLineArray[i]);

            } // end replace


            // resetting array and counter

            tempLineArray = new int[LINE_LIMIT];

            lineBreakCount = 0;

        }

    }

    scanner.close();

}

或者使用 BufferedReader。如果通过替换您自己的逻辑存在内存问题,您可能不需要 ArrayList 来存储所有值。


public static void parseCsv() throws IOException {

    BufferedReader br = new BufferedReader(new FileReader(file));

    // your delimiter

    char TOKEN = ',';

    // your requirement of storing 10 values for each "line"

    int LINE_LIMIT = 10;

    // tmp for storing from BufferedReader.read()

    int tmp;

    // a counter for line break

    int lineBreakCount = 0;

    // array for storing 10 values, assuming the values of CSV are integers

    int[] tempArray = new int[LINE_LIMIT];

    // storing tempArray of each line to ArrayList

    ArrayList<int[]> lineList = new ArrayList<>();

    StringBuilder sb = new StringBuilder();


    while((tmp = br.read()) != -1) {

        if ((char)tmp == TOKEN) {

            if (lineBreakCount == LINE_LIMIT) {

                // your logic to handle the current "line" here.

                lineList.add(tempArray);

                // new "line"

                tempArray = new int[LINE_LIMIT];

                lineBreakCount = 0;

            }

            // storing current value from buffer with trim of spaces

            tempArray[lineBreakCount] =

                    Integer.parseInt(sb.toString().trim());

            lineBreakCount++;

            // clear the buffer

            sb.delete(0, sb.length());

        }

        else {

            // add current char from BufferedReader if not delimiter

            sb.append((char)tmp);

        }

    }

    br.close();

}


查看完整回答
反对 回复 2022-06-15
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

我的建议是读取文件 f1.txt 并通过删除所有空行和空格写入花药文件 f2.txt 然后读取 f2.txt 之类的东西


FileReader fr = new FileReader("f1.txt"); 

BufferedReader br = new BufferedReader(fr); 

FileWriter fw = new FileWriter("f2.txt"); 

String line;


 while((line = br.readLine()) != null)

line = line.trim(); // remove leading and trailing whitespace

if (!line.equals("")) // don't write out blank lines

{

    fw.write(line, 0, line.length());

}

}


然后尝试使用您的代码。


查看完整回答
反对 回复 2022-06-15
  • 4 回答
  • 0 关注
  • 76 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信