Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取.txt文件中的数据并根据无限可能的整数分别打印输出_Java - Fatal编程技术网

Java 读取.txt文件中的数据并根据无限可能的整数分别打印输出

Java 读取.txt文件中的数据并根据无限可能的整数分别打印输出,java,Java,如果这个问题以前被问过一千次,我很抱歉。我试着搜索,但没能找到我要找的东西 我对编码相当陌生,所以我正在尝试一个项目,我姐姐在她的工作场所一直需要做一些练习 她需要的程序似乎很简单,我已经把一切都弄清楚了,只有一部分(尽管这是程序最重要的方面)。基本上,她需要的程序扫描.txt文件中的数据,并根据与该int相关联的字符串对应的特定int值以所需格式打印信息 文本文件有两列,基本上如下所示: Column A Column B Quantity CPT code 1

如果这个问题以前被问过一千次,我很抱歉。我试着搜索,但没能找到我要找的东西

我对编码相当陌生,所以我正在尝试一个项目,我姐姐在她的工作场所一直需要做一些练习

她需要的程序似乎很简单,我已经把一切都弄清楚了,只有一部分(尽管这是程序最重要的方面)。基本上,她需要的程序扫描.txt文件中的数据,并根据与该int相关联的字符串对应的特定int值以所需格式打印信息

文本文件有两列,基本上如下所示:

Column A     Column B
Quantity     CPT code
1            V5008
1            V5010
1            V5285
2            0002M
2            0058T
3            0111T
3            0169T
If IsCPT("V5008,V5010,V5285") Then
   If Quantity > 1 AND Allowance > 0.0 Then
      HoldBill("MUE Edits")
   End If

ElseIf IsCPT("0002M,0058T") Then
   If Quantity > 2 AND Allowance > 0.0 Then
      HoldBill("MUE Edits")
   End If

ElseIf IsCPT("0111T,0169T") Then
   If Quantity > 3 AND Allowance > 0.0 Then
      HoldBill("MUE Edits")
   End If
。。。。。诸如此类。我遇到的问题是,这些列表每天都在变化,其中的值也在变化,而且它们非常长(我当前用于创建程序的列表是11185行)。此外,无法知道第一列中的值是什么,这就是输出的分隔方式。第一列中的数字可能是1、2、16、147、8000。。。可以是任何数字

输出需要根据这些数字单独打印。例如,上面的输出如下所示:

Column A     Column B
Quantity     CPT code
1            V5008
1            V5010
1            V5285
2            0002M
2            0058T
3            0111T
3            0169T
If IsCPT("V5008,V5010,V5285") Then
   If Quantity > 1 AND Allowance > 0.0 Then
      HoldBill("MUE Edits")
   End If

ElseIf IsCPT("0002M,0058T") Then
   If Quantity > 2 AND Allowance > 0.0 Then
      HoldBill("MUE Edits")
   End If

ElseIf IsCPT("0111T,0169T") Then
   If Quantity > 3 AND Allowance > 0.0 Then
      HoldBill("MUE Edits")
   End If
我很难将第二列中的字符串彼此分开,这样就不能一起打印。现在,我将第二列存储在一个字符串数组中,一旦所有内容都被读入,就会循环并打印每个索引

当第一列可以是任意数字时,您将如何根据第一列保持第二列的分隔?您会使用2d数组,将int值存储在每行的第一个索引中,并用关联的字符串填充行吗

我很抱歉这个冗长的问题,但我想尽可能彻底。如果任何想帮忙的人需要看我写的一些代码,我很乐意发布。让我知道

提前感谢您的帮助

编辑:谢谢你的回复。下面是我的类的外观,它负责扫描数据

import java.util.Arrays;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.ArrayList;

public class Processor {

private String[] finalArray;
private int numberOfCpt;
private int quantity;
private int i = 1;
private int length;
private int length1;
private int lineLength;

public Processor() {
  finalArray = new String[0];
}

public void addCptToArray(String cptCodeIn) {
  finalArray = Arrays.copyOf(finalArray, finalArray.length + 1);

  length = finalArray.length;
  finalArray[length - 1] = cptCodeIn;  
}

public void newArray() {
  length = finalArray.length;

  finalArray = Arrays.copyOf(finalArray, finalArray.length - length);
}

public int getNumberOfCpt() {
  return numberOfCpt;
}

public void readFile(String fileIn) throws IOException {

String fileName = fileIn;
Scanner scan = new Scanner(new File(fileName));
scan.nextLine();

while (scan.hasNext()) {

String file = scan.nextLine();
Scanner scan2 = new Scanner(file);
quantity = scan2.nextInt();
String cpt = scan2.next(); 

for (i = i; i <= finalArray.length + 1;) {
  if (quantity == i) { 
   addCptToArray(cpt);
   break;
}

  if (quantity != i) {
   i++;
 }
}

numberOfCpt = finalArray.length - 1;     
} 


public String generateReport() {
String output = "";
String output1 = "";
output += "If ";
String line1 = "";

for (int j = 0; j < finalArray.length; j++) {
   output1 += finalArray[j] + ",";
}

for (String line : charLimiter(output1, 320)) {
   lineLength = line.length();
   length1 = line.length() - 6;

if (line.substring(length1, lineLength).contains(",")) {
   line1 = line.substring(length1, lineLength).replace(",", "");
   line = line.substring(0, length1);
   line = line.concat(line1);
}

if (lineLength == 318) { 

   output += "IsCPT" + "(" + "\"" + line 
                     + "\""  + ")" + " or\n\n";
}

else {
   output += "IsCPT" + "(" + "\"" + line + "\""  
                     + ")" + " Then";

   output += "\n   If Quantity > " + quantity + " AND Allowance >" 
                     + " 0.0 Then \n      HoldBill(\"MUE Edits\")"
                     + "\n   End If";
  }
}

return output;
}

private static ArrayList<String> charLimiter(String input, int limit) {
ArrayList<String> list = new ArrayList<>();
String[] parts = input.split(",");
StringBuilder sb = new StringBuilder();
  for (String part : parts) {
    if (sb.length() + part.length() > limit) {
      list.add(sb.toString().substring(0, sb.toString().length()));
      sb = new StringBuilder();
  }
     sb.append(part + ",");
}

if (sb.length() > 0) {
     list.add(sb.toString());
}

return list;
}
导入java.util.array;
导入java.io.File;
导入java.io.IOException;
导入java.util.Scanner;
导入java.util.ArrayList;
公共类处理器{
私有字符串[]finalArray;
私人国际号码;
私人整数数量;
私有int i=1;
私有整数长度;
私人内部长度1;
专用整数线长度;
公共处理器(){
finalArray=新字符串[0];
}
public void addCptToArray(字符串cptCodeIn){
finalArray=Arrays.copyOf(finalArray,finalArray.length+1);
长度=finalArray.length;
finalArray[length-1]=cptCodeIn;
}
public void newArray(){
长度=finalArray.length;
finalArray=Arrays.copyOf(finalArray,finalArray.length-length);
}
public int getNumberOfCpt(){
返回编号CPT;
}
public void readFile(字符串fileIn)引发IOException{
字符串fileName=fileIn;
扫描仪扫描=新扫描仪(新文件(文件名));
scan.nextLine();
while(scan.hasNext()){
String file=scan.nextLine();
Scanner scan2=新扫描仪(文件);
数量=scan2.nextInt();
字符串cpt=scan2.next();
对于(i=i;i限制){
添加(sb.toString().substring(0,sb.toString().length());
sb=新的StringBuilder();
}
sb.附加(部分+“,”);
}
如果(sb.length()>0){
添加(sb.toString());
}
退货清单;
}

我知道readFile()下的for循环看起来很不稳定(程序的其他部分可能也是如此)。我一直在尝试各种可能的方法来实现这一点,因此一些变量和方法是创建的,但没有使用。

如果两列中有一列是唯一的,那么使用某种映射是可行的。假设列B(代码)是唯一的,您将拥有一个存储代码->数量的映射。您将使用HashMap集合来实现此目的

HashMap<String, int> codesToQuantities = new HashMap<>();

//pseudo-code describing the rough algorithm of parsing the file
for(String line in yourDataFile){
    String[] columns = line.split(" "); //or however you split up the columns based on the input

    String code = columns[1];
    int quantity = Integer.parseInt(columns[0]);

    codesToQuantities.put(code, quantity);
}

映射是计算中的基本数据类型之一,因此如果您不熟悉它们,我建议您阅读它们。它们非常强大。

请发布您已经编写的代码,以便我们可以帮助您更正它。您能创建一个hashmap吗?我也在想hashmaps,@AbtPst,但a列数据在本示例中并不唯一。perhaps列B可以是键?如果colB具有唯一的值,则创建一个以colB为键的哈希映射。如果colA中的值是固定的,则您甚至可以将colA保留为键。在这种情况下,保留字符串列表(colB值)作为价值谢谢。我不熟悉HashMaps,所以我会读一读它们,看看你的建议,看看我是否能理解。再次感谢你的帮助。