在文件中查找字符串,然后在其后复制行

时间:2017-03-14 22:09:39

标签: java

这是我第一次发布到这个网站,所以如果我的格式错误,请对我很轻松Lol

我正在编写一个Java程序,需要从库存中查找部件号,然后打印部件号以及随后的数据。代码只打印出文件顶部的信息,然后重复我的else语句5次。

以下是代码:

select t.id, t.name, t.yearofstudy, t.mark
from t
  inner join (
  select 
      yearofstudy
    , min(mark) as minMark
  from t
  group by yearofstudy
  ) as m 
    on t.yearofstudy = m.yearofstudy
   and t.mark = minMark

这是我想要提取的数据文件:

package inventory;
import java.util.Scanner;
import java.io.*;

public class inventory 
{

public static void main(String[] args) throws IOException
{
    Scanner keyboard = new Scanner(System.in);

    // File Information
    String parts;
    File inventoryFile;
    FileWriter inventoryFW;
    PrintWriter inventoryPW;
    Scanner inventorySC;

    //User Information
    String userChoice;

    // Part Information
    String partID, partFileID, partFileDesc, partFileLoc, partDesc, partLoc;
    double partFilePrice, partPrice;
    int partFileQuan, partQuan;

    userChoice = ("A");

    // Loop
    if(userChoice.equalsIgnoreCase("Q"))
        System.exit(0);
    else
        while(!userChoice.equalsIgnoreCase("Q"))
        {
            // Get Employee Decision
            System.out.println("Please choose a letter: \n"
                               + "L - Look Up Part \n"
                               + "A - Add to Inventory File \n"
                               + "E - Erase From Inventory File \n" 
                               + "G - Generate a Sales Slip \n"
                               + "I - Add Quantity to Inventory File \n"
                               + "D - Display Inventory \n"
                               + "Q - Quit \n"
                               + "Selection: ");
            userChoice = keyboard.nextLine();

            // Process User Choice
            if(userChoice.equalsIgnoreCase("L"))
            { // Choice L
                // Look Up Part
                System.out.println("Enter Part I.D. Number: ");
                partID = keyboard.nextLine();

                // Do until partID is equal to partFileID
                parts = "inventoryFile.txt";
                inventoryFile = new File(parts);
                inventorySC = new Scanner(inventoryFile);

                partFileID = "0";
                partFileDesc = "0";
                partFilePrice = 0;
                partFileLoc = "0";
                partFileQuan = 0;


                while(inventorySC.hasNextLine())
                {
                    String lineFromFile = inventorySC.nextLine();
                    if(lineFromFile.contains(partID))
                    {

                        partFileDesc = inventorySC.nextLine();
                        partFilePrice = inventorySC.nextDouble();
                        inventorySC.nextLine();
                        partFileLoc = inventorySC.nextLine();
                        partFileQuan = inventorySC.nextInt();

                        System.out.println("Part I.D. Number: " + partFileID + "\n");
                          System.out.println("Part Description: " + partFileDesc + "\n"
                                   + "Part Price: " + partFilePrice + "\n"
                                   + "Part Location: " + partFileLoc + "\n"
                                   + "Part Quantity: " + partFileQuan);
                    }
                    else
                        System.out.println("Sorry, this part cannot be found");

                }
            }
          }
        }
    }  

例如,如果用户输入了部件号“1234”,程序应在文件中搜索该部件号,然后显示:

1234567
Clutch
45.68
Warehouse B
8
1234
Brake
66.78
Warehouse A
4

对于任何糟糕的代码格式化,我很抱歉,我一直在争论这段时间。 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

您的问题是,如果零件清单中不包含零件值,您只会跳到下一行。如果零件不在“下一行”上,你实际上想要跳过5行。

在“else”语句中,您只想调用inventorySC.nextLine();再多4次到达你想要检查零件号的文件中的下一个位置。

如果您希望“未找到”条件更有效地反映实际上根本找不到部件号,则您需要将该消息移动到扫描整个文件之后。在文件扫描之前,将名为“found”的布尔值设置为false。如果您输入'包含'条件,因为文件中包含您输入的部件号,请将'found'设置为true。

如果'found'仍为'false',则可以输出'not found'消息。

答案 1 :(得分:0)

有一些问题。

  1. 包含多个匹配项。
  2. 您将打印未找到的“找不到每一行”。
  3. 你没有摆脱循环。
  4. boolean found = false;
    while(inventorySC.hasNextLine()){
        String lineFromFile = inventorySC.nextLine();
        if(lineFromFile.equals(partID)) {       
         partFileDesc = inventorySC.nextLine();
         partFilePrice = inventorySC.nextLine();
         partFileLoc = inventorySC.nextLine();
         partFileQuan = inventorySC.nextLine();
    
          System.out.println("Part I.D. Number: " + partFileID + "\n");
                                  System.out.println("Part Description: " + partFileDesc + "\n"
                                           + "Part Price: " + partFilePrice + "\n"
                                           + "Part Location: " + partFileLoc + "\n"
                                           + "Part Quantity: " + partFileQuan);
                                  found = true;
                                 break;
                            }
                }
    
    if(!found)
        System.out.println("Sorry, this part cannot be found");
    

答案 2 :(得分:0)

正如MadProgrammer在上面评论的那样,你需要使用等于'等等。而不是'包含' - 这就是您在第一个条目上匹配的原因。当你找到一个匹配并输出它时,你需要使用' break'退出while循环。 - 否则你输出剩下的每一行的else值(发生在你身上)。但是还有一个问题是你可能需要阅读整个记录 - 而不仅仅是记录的第一行 - 如果没有匹配,那么当库存项目的数量为1234时你就不会搞砸了在搜索零件号1234时。