有关line.split CSV的帮助

时间:2010-02-16 01:53:34

标签: java csv split

我是初学者,所以请不要爆炸我的工作到目前为止:) 我正在尝试读取CSV文件,然后查看它是否与某些命令匹配。 CSV中的某些数据有一段时间,我认为当我试图拆分它时它会搞乱。当我尝试转储我的阵列以查看其中的内容时,它总是在这段时间后被切断。这是一个数据样本。任何帮助,将不胜感激。我再次成为初学者,所以简单易懂。

示例数据

create,Mr. Jones,blah,blah
create,Mrs. Smith,blah,blah
public class TestHarness {
        public static void main(String[] args) throws IOException, FileNotFoundException {

    Scanner input = new Scanner(new File("C:\\Users\\Ree\\Desktop\\SPR\\commands.txt"));

    String[] validCommands = { "create", "move", "useWeapon", "search", "heal" };

    boolean proceed = false;

    while (!proceed)
    {
       for (int i = 0; i < validCommands.length; i++)
       {
          String line = input.next();
          String[] nline = line.split (",");

          if (nline[0].equals("create")) 
          {
            String soldierName = nline[1];
            String soldierType = nline[2];
            String weapon = nline[3];
            Soldier aSoldier = new Soldier(soldierName,weapon);

            System.out.println("Command: "+ nline[0] +","+ soldierName +","+ soldierType+","+ weapon);

            if (soldierType.equals("enlisted"))
            {
                Soldier s = new Enlisted(soldierName,weapon);
                System.out.println(s.toString());
            }
            else if (soldierType.equals("officer"))
            {
                Soldier s = new Officer(soldierName,weapon);
                System.out.println(s.toString());
            }
          }

          else if (nline[0].equals("useWeapon")) {
              System.out.print("weapon " + nline[0] + "\n");
          }
          else if (nline[0].equals("move")) {
              System.out.print("move " + nline[0] + "\n");
          }
          else if (nline[0].equals("search")) {
              System.out.print("search " + nline[0] + "\n");
          }
          else if (nline[0].equals("heal")) {
              System.out.print("heal " + nline[0] + "\n");
          }
        }
    }
}

}

3 个答案:

答案 0 :(得分:2)

调用Scanner.next只会返回下一个单词(以空格分隔)。

您需要调用nextLine一次读取整行。

答案 1 :(得分:1)

有几种可用于Java的开源CSV parers:

答案 2 :(得分:0)

这是一个相当快速的错误,不是吗?

这不是您的问题的答案,而是建议使用哈希。 首先定义一个接口

public interface InputDance
{
  public void dance(String[] input);
}

我建议您的主要例程

public static void main(String[] args)
  throws IOException, FileNotFoundException{

  Scanner input = new Scanner(
  new File("C:\\Users\\Ree\\Desktop\\SPR\\commands.txt"));

  String line = input.nextLine();
  String[] nline = line.split (",");
  InputDance inputxn = inputActions.get(nline[0]);
  if (inputxn!=null)
    inputxn.dance(nline);
}

您将使用哈希来存储InputDance接口概述的所有操作。

这样您的输入阅读程序就会简化为

  • 从操作哈希中检索操作 使用输入的word0作为关键。
  • 执行该操作

如果你只有五种类型的士兵,你可以将所有逻辑放在一个例程中。 但是,对于超过10种类型的人员,将行动置于例行程序之外会更加清晰。

如果您正在编写计算机游戏,或者将人事记录保存在军事数据库中,您会经常遇到增强请求,以包括规则的新人员类型或例外。那么你的if-then-else-if链会变得越来越长,令人困惑。特别是当士兵们对不同的曲调跳舞时有特殊要求。或者当您的游戏画布或人员数据库需要包含非战斗单位时。但是,当然,每次有新的人员类型时,您仍需要更新主类中的哈希值。

请注意,在我的推荐中,您所做的所有例程都是执行dance(String [])方法。任何复杂情况都将由实施舞蹈的个别班级处理。

接下来定义一个实现类

public class SoldierDance
  implements InputDance
{
  public void dance(String[] nline){
    String soldierName = nline[1];
    String soldierType = nline[2];
    String weapon = nline[3];

    System.out.println(
      "Command: "+ nline[0] +","+ soldierName +","+ soldierType+","+ weapon);

    Soldier s;
    if (soldierType.equals("enlisted")){
      s = new Enlisted(soldierName,weapon);
    }
    else if (soldierType.equals("officer")){
      s = new Officer(soldierName,weapon);
    }
    else{
      s = new Soldier(soldierName,weapon);
    }

    System.out.println(s.toString());
  }
}

然后定义你的主类。请注意,哈希是一个静态实例。

另外,有一个占位符舞蹈,所以当你有一个新的人员类型,但你不知道该怎么做它,你只需将新的人员类型哈希到这个占位符舞蹈。

注意,例如在“useWeapon”哈希键中,一个接口也可以匿名实现

public class TestHarness
{
  static public class PlaceHolderDance
    implements InputDance
  {
    public void dance(String[] nline){
      System.out.print("Action=" + nline[0] + "\n");
    }
  }

  static public Hashtable<String, InputDance> inputActions;

  // A static enclosure is to execute all the class definition once.
  static {
    inputActions = new Hashtable<String, InputDance>();

    InputDance placeHolderAction = new PlaceHolderDance();

    inputActions.put("create", new SoldierDance());
    inputActions.put("move", placeHolderAction);
    inputActions.put("search", placeHolderAction);
    inputActions.put("heal", placeHolderAction);

    // Can also anonymously implement an interface
    inputActions.put("useWeapon",
      new InputDance(){
        public void dance(String[] nline){
          System.out.print("weapon " + nline[0] + "\n");
        }
      }
    );

  }

  // The static main method
  public static void main(String[] args)
    throws IOException, FileNotFoundException{
  Scanner input = new Scanner(
    new File("C:\\Users\\Ree\\Desktop\\SPR\\commands.txt"));

      String line = input.nextLine();
      String[] nline = line.split (",");
      InputDance inputxn = inputActions.get(nline[0]);
      if (inputxn!=null)
        inputxn.dance(nline);
    }
}

而且,如果士兵类与其输入舞之间存在一对一的对应关系,您甚至可以在士兵类中实施InputDance并提供舞蹈方法。