【问题标题】:How to parse a CSV file如何解析 CSV 文件
【发布时间】:2013-02-25 20:34:55
【问题描述】:

我正在尝试读取一个由几行组成的文件,每行包含 3 个部分:id、name 和 surname。还有一个EditText,用户需要在其中输入他的id,如果它与从文件中读取的其中一个匹配,它应该显示一个类似这样的对话框:你是“姓名”,“用户名”吗?

我试过做以下事情,但不幸的是它不起作用。

public String getDNI() {
    String[] parts = fichero.split("\\,");
    String DNI = parts[0];
    return DNI;
}

public String getNombre() {
    String[] parts = fichero.split("\\,");
    String Nombre = parts[1];
    return Nombre;
}

public String getEnunciado() {
    String[] parts = fichero.split("\\,");
    String Apellido = parts[2];
    return Apellido;
}



public void onCreate(Bundle icicle)
   {
      super.onCreate(icicle);
      setContentView(R.layout.identificacion);
      Button bSiguiente = (Button) findViewById(R.id.btn_siguiente);
     dniText = (EditText) findViewById(R.id.dni_candidato);

     try {
            InputStream is = getAssets().open(File);
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            // Skips lines
            for (i = 0; i<= 100; i++) {
                reader.readLine();

            }
            fichero = reader.readLine();


        } catch (IOException e) {
            e.printStackTrace();
        }



bSiguiente.setOnClickListener(new View.OnClickListener() {
    public void onClick(View arg0) {



   try{
       longitud = dniText.getText().toString();
          user = Integer.parseInt(dniText.getText().toString());
          DNIWord(user);
          for (i = 0; i<= 100; i++) {
         if (longitud.equals(getDNI())){
             // (longitud.length()==8){
                     showDialog(DIALOG_CONFIRMAR_CANDIDATO);}

                else{
                 showDialog(DIALOG_ERROR_DNI);
                }

   }
   }
      catch (NumberFormatException e)
    {}
    }

【问题讨论】:

  • 我没有看到你的getDNI()getNombre()getgetEnunciado() 函数被调用的任何地方。我们还缺少更多代码吗?

标签: android split readline


【解决方案1】:

更好的方法是创建一个类来代表您的用户:

class User{
    public String nombre;
    public String enunciado;
    public String dni;

   public User(String nombre, String enunciado, String dni){
      this.nombre = nombre;
      this.enunciado = enunciado;
      this.dni = dni;
   }

   public User(String csvLine){
       String[] values = csvLine.split(",");
       this(values[0], values[1], values[2]);
   }

}

我更喜欢第一个构造函数,因为它更容易阅读。

这样使用:

ArrayList<User> users = new ArrayList<User>();

...

     String s;
     while ((s = reader.readLine()) != null) {
         users.add(new User(s));
     }

 String s;
 String[] value;
 while ((s = reader.readLine()) != null) {
     values = s.split(",");
     users.add(new User(values[0], values[1], values[2])); <-- prefer this one
 }

为了让它变得更好:

public static final int DNI = 0;
public static final int NOMBRE = 1;
public static final int ENUNCIADO = 2;

...

     String s;
     String[] value;
     while ((s = reader.readLine()) != null) {
         values = s.split(",");
         users.add(new User(values[DNI], values[NOMBRE], values[ENUNCIADO]));
     }

现在您可以使用users.containsusers.getElementAtCollections.sortCollections.binarySearch 等来处理您的用户集合。

【讨论】:

    【解决方案2】:

    这是另一个有助于在 C++ 中解析 CVS 的问题:How can I read and parse CSV files in C++?

    如果您对其他语言(如 python)持开放态度,那可能会容易得多。例如,python 有内置的 csv 工具: http://docs.python.org/2/library/csv.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多