2017-02-12 3 views
-2

Вот мой текущий код:чтения файла CSV и разделив его в массиве (Java)

public static String findPhoneNumber(Scanner input, String name) { 
    String[] arr; 
    while (input.hasNextLine()){ 
     arr = name.split(DELIMITER); 
     input.nextLine(); 
     for (int i=0;i<=arr.length;i++) { 
      if (arr[0].endsWith(name)) { 
       return (arr[3]); 
      } 
      else { 
       return("Nothing to return"); 
      } 
     } 
    } 
    CSV.testFindPhoneNumber(arr[3]); 
} 


package com.company; 

import java.io.IOException; 
import java.net.URL; 
import java.util.Scanner; 

public class CSV { 
public static final String CSV_FILE_URL = "https://orb.essex.ac.uk/ce/ce152/data/staff.csv"; 

public static void main(String[] args) throws IOException { 
    URL url = new URL(CSV_FILE_URL); 
    Scanner input = new Scanner(url.openConnection().getInputStream()); 
    testFindPhoneNumber(input); 
} 

public static void testFindPhoneNumber(Scanner input){ 
    System.out.println("### Testing findPhoneNumber"); 
    for (String name : new String[]{"Kruschwitz", "Vickers", "Voelker"}){ 
     String result = TestCSV.findPhoneNumber(input,name); 
     System.out.println("name= " + name + ", result= " + result); 
    } 
    } 
} 

Я пытаюсь разбить файл Excel (URL-адрес, который у меня есть в моем коде) к 3 и затем найдите имена, написанные в CSV общедоступного класса, чтобы напечатать соответствующие номера телефонов этих имен.

Не знаю, как это сделать. Любой совет будет принят во внимание.

+5

A) никогда * ссылку * на исходный код - вместо этого поместите его (хорошо отформатированный) в свой вопрос B) объясните, почему ваш код не работает - это не сайт, на котором вы отбрасываете требования, и мы делаем e работа для вас. C) Есть тонны и тонны существующих синтаксических анализаторов CSV ... попробуйте использовать один из них. – GhostCat

+0

@GhostCat Я полагаю, мне нужно вернуть значение arr [3] в мой класс CSV, похоже, не может понять, как это работает. И я на самом деле не прошу кого-нибудь рассказать мне, как это сделать, мне просто нужен совет о том, как улучшить это. – Mortexe

+0

Спасибо за быстрое принятие. Но имейте в виду: такой «обзор кода» для такого ввода * низкого качества действительно является исключением. Вы абсолютно должны попытаться пойти на более мелкие шаги и получить те небольшие вещи, которые работают на вас самих (или поставить очень конкретный вопрос вокруг ** одного ** сбоя аспект вашей программы здесь). Пожалуйста, поймите, что это сообщество предназначено для «профессионалов и энтузиастов»; это ** не ** нацеливание новичков, которые борются с самыми первыми основными шагами. Но как сказал: рад, что я мог бы помочь; и что вы приняли это быстро. – GhostCat

ответ

0

Ваш основной класс, т. Е. CSV выглядит хорошо для меня. Проблема заключается в методе findPhoneNumber, который вызывается в основном классе. Ниже приведена исправленная версия.

public static String findPhoneNumber(Scanner input, String name){ 
     String[] arr; 
     String phoneNum = null; 
     while (input.hasNextLine()){ 
      arr = input.nextLine().split(","); 
      if (arr[0].endsWith(name)) { 
       phoneNum = arr[2]; 
       break; 
      } 
     } 
     return phoneNum; 
    } 

Вот выход.

Тестирование findPhoneNumber

имя = Kruschwitz, результат = 5A.542

имя = Vickers, результат = 5A.528

имя = Воелкер, результат = нуль

0

В коде есть много чего не так. Давайте быстро рассмотрим самые важные вещи:

public static String findPhoneNumber(Scanner input, String name) { 
String[] arr; 

Плохое именование. Что такое arr Предполагается делать? Дайте ему имя, которое сообщит, что это означает.

while (input.hasNextLine()){ 
    arr = name.split(DELIMITER); 

Почему вы разделив имя? Имя - фиксированный параметр, входящий в ваш метод ?!

input.nextLine(); 

Вы читаете строку ... но не сохраняете этот результат. Другими словами: вы читаете весь ввод, но не обрабатываете любым.

Возможно, вы имеете в виду String line = input.nextLine(); и впоследствии ваш метод захочет работать над этим line, исходящим из URL-файла.

for (int i=0;i<=arr.length;i++) { 
     if (arr[0].endsWith(name)) { 
      return (arr[3]); 
     } 
     else { 
      return("Nothing to return"); 
     } 
    } 

Я понятия не имею, чего вы хотите достичь при этом сравнении. А затем: never верните некоторое «сообщение», чтобы указать на ошибку (для метода, который возвращает строку). Как призрак этого метода должен понимать, что что-то пошло не так?

Итак: вместо того, чтобы возвращать сообщение, введите исключение или отправьте null.

И наконец: вы полностью перегружаете себя. Не пытайтесь читать CSV с удаленного URL-адреса, разделять и обрабатывать, которые вводят все в один шаг. Вместо этого: сначала напишите код, который просто читает этот URL, и, возможно, печатает данных. Затем, когда это работает красиво, напишите отдельный код, который выполняет «сопоставление», которое вы хотите сделать с помощью простого ввода строки. И затем, наконец, объедините эти вещи.

Но снова: простой split(",") делает не работу для произвольных данных CSV. CSV намного сложнее. Не пытайтесь заново изобрести колесо; особенно когда вы на таком уровне новичка.

+0

Спасибо за это, я рассмотрю, что вы упомянули выше. – Mortexe