2017-02-09 2 views
-1

У меня есть CSV-файл, который отформатирован следующим образом:Неправильный выход с помощью replaceAll()

1,,3,4 
3,4,,0 
2,,4,2 

Я читаю этот файл в строковую переменную под названием текста. Затем, делая это

String newText = text.replaceAll("","0"); 

В моем выходе, она не будет заменить никакой ценности элементов с 0, который является то, что я хочу, но это также присоединяя 0 до и после того, как элементы, которые действительно имеют значение.

010 
0 
030 
040 
030 
040 
0 
000 
020 
0 
040 
020 

Любые помощь приветствуется!

EDIT: Вот остальная часть моего кода для clairification.

import java.lang.*; 

public class DataMatrix { 

    private double[][] dMatrix; 

    public DataMatrix(String text) { 

     String[] line = text.split("\n"); 
     // Creates an array for the CSV file 
     String[][] sMatrix = new String[line.length][]; 

     for(int i=0; i < line.length; i++) 
      sMatrix[i] = line[i].split(","); 

     /*for(int j=0; j < sMatrix.length; j++) { 
      for(int x=0; x <= line.length; x++) { 
       if(sMatrix[j][x] !=*/ 

     System.out.println("Original String: "); 

     for(int x=0; x < sMatrix.length; x++) { 
      for(int j=0; j <= line.length; j++) { 
       System.out.println(sMatrix[x][j]); 
      } 
     } 

     dMatrix = new double[sMatrix.length][]; 
     System.out.println("Converted to double: "); 

     for(int x=0; x < sMatrix.length; x++) { 
      dMatrix[x] = new double[sMatrix[x].length]; 
      for(int j=0; j <= sMatrix.length; j++) { 

       dMatrix[x][j] = Double.parseDouble(sMatrix[x][j]); 
       System.out.println(dMatrix[x][j]); 
      } 
     } 
    } 

    public void avgRowValue() { 

     double tempTotal = 0; 

     for(int x=0; x < dMatrix.length; x++) { 
      System.out.println("***********************************"); 
      System.out.println("The average for row "+(x+1)+" is: "); 

      for(int i=0; i < dMatrix[x].length;i++) { 
       tempTotal += dMatrix[x][i]; 
      double rowAvg = tempTotal/dMatrix[x].length; 
      System.out.println(rowAvg); 
      tempTotal = 0; 
      } 
     } 

    } 

    public void avgColValue() { 

     double tempTotal = 0; 

     for(int x=0; x < dMatrix[0].length; x++) { 
      System.out.println("**************************************"); 
      System.out.println("The average for column "+(x+1)+" is: "); 

      for(int i=0; i <= dMatrix.length-1; i++) 
       tempTotal += dMatrix[i][x]; 
      double colAvg = tempTotal/dMatrix.length; 
      System.out.println(colAvg); 
      tempTotal = 0; 
     } 
    } 

    public void overallAvgValue() { 

     double tempTotal = 0; 
     int count = 0; 

     for(int x=0; x < dMatrix.length; x++) { 
      for(int i=0; i <= dMatrix.length; i++) { 
       tempTotal += dMatrix[x][i]; 
       count++; 
      } 
     } 
     double overallAvg = tempTotal/count; 
     System.out.println("The overall average for the data matrix is: "+overallAvg); 
    } 

    public void maxValue() { 

     double maxValue = 0; 

     for(int x=0; x < dMatrix.length; x++) { 
      for(int i=0; i <= dMatrix.length; i++) { 
       if(dMatrix[x][i] >= maxValue) 
        maxValue = dMatrix[x][i]; 
      } 
     } 
     System.out.println("The max value for the data matrix is: "+maxValue); 
    } 

    public void minValue() { 

     double minValue = dMatrix[0][0]; 

     for(int x=0; x < dMatrix.length; x++) { 
      for(int i=0; i <= dMatrix.length; i++) { 
       if(dMatrix[x][i] <= minValue) 
        minValue = dMatrix[x][i]; 
      } 
     } 
     System.out.println("The min value for the data matrix is: "+minValue); 
    } 
} 

и моя главная:

import java.util.*; 

public class Assignment1{ 
    public static void main(String[] args){ 

     Scanner input = new Scanner(System.in); 

      //Make sure the user passed the command line argument - and nothing else 
      if (args.length != 1){ 
       System.out.println("Assignment1 takes exactly one command-line argument."); 
        System.out.println("Usage: java Assignment1 some_file.csv"); 
       System.exit(0); 
      } 

      String csvFileName = args[0]; 

      //Instantiate my custom file reader 
     CSVReader fileReader = new CSVReader(); 

     //Read the file into a string 
     String text = fileReader.readFile(csvFileName); 
    String newText = text.replaceAll("", "0"); 
    //Create a new instance of DataMatrix that takes in String CSV file and converts to double array 
    DataMatrix matrix = new DataMatrix(newText); 

    boolean done = false; 
    while(done != true) { 
     System.out.println("**********************"); 
     System.out.println("CSV Reader Menu: "); 
     System.out.println("1. Display the average values of each individual row."); 
     System.out.println("2. Display the averages value of each individual column."); 
     System.out.println("3. Display the average of the entire data matrix."); 
     System.out.println("4. Display the maximum value of the entire data matrix."); 
     System.out.println("5. Display the minimum value of the entire data matrix."); 
     System.out.println("0. Exit."); 

     int choice = input.nextInt(); 
     switch(choice) { 
      case 1: matrix.avgRowValue(); 
       break; 
      case 2: matrix.avgColValue(); 
       break; 
      case 3: matrix.overallAvgValue(); 
       break; 
      case 4: matrix.maxValue(); 
       break; 
      case 5: matrix.minValue(); 
       break; 
      case 0: done = true; 
       break; 
      default: System.out.println("Invalid input."); 
       break; 
     } 
    }//end of menu loop 
    }//end of main 
}//end of class 
+0

@azurefrog ошибочный код ... –

+0

@azurefrog багги например, ', выход должен быть : '0 0', но с вашим кодом ничего нет –

+0

Извините за путаницу @azurefrog! То, что я пытаюсь сделать, - это прочитать файл csv и поместить его в массив (который я уже сделал). Затем, когда одно из пятен в файле csv не имеет значения, и мне нужно назначить ему 0. –

ответ

0

Я предлагаю использовать библиотеку, такие как OpenCSV прочитать этот файл, а затем заменить пустые ячейки, как вы столкнетесь с ними. Это будет намного более надежным.

0

Я понимаю, что text содержит значение одного столбца после разделения строки на запятую. Вы хотите изменить пустые строки на «0».

Метод replaceAll() принимает значение regex. Пустая строка странная для регулярного выражения. То, что вы хотите, - text.replaceAll("^$", "0").

+1

работает на ',,' в качестве примера? –

+0

@Mohsen_Fatemi нет, и OP не нужно проверять на ',,'. Он уже разделил линию на отдельные значения. Запятых больше нет. –

+0

@KlitosKyriacou Спасибо за ваш ответ. Я пробовал то, что вы заявили, и он не заменяет пустые значения 0 на моем выходе. –

3

С text.replaceAll("", "0") вы ищете все места, где в строке есть подстрока нулевой длины. Это для любой строки, между любыми двумя символами, а также в начале и в конце строки.

"12345".replaceAll("", "_") // _1_2_3_4_5_ 

Если вы действительно хотите использовать регулярное выражение для этого, вы можете использовать replaceAll("^$", "0"), где ^ и $ являются начало и конец строки соответственно. В качестве альтернативы, просто проверить, является ли строка пустой:

String newText = text.isEmpty() ? "0" : text; 

Пример:

for (String s : "1,,23,4".split(",")) { 
    System.out.println(s.isEmpty() ? "0" : s); // prints 1, 0, 23, and 4 
    System.out.println(s.replaceAll("^$", "0"));// prints 1, 0, 23, and 4 
} 

Если вы хотите, чтобы вставить эти 0 в исходной строке, то есть перед использованием split, вы могли бы использовать дизъюнкция различных регулярных выражений для случаев начала строки, средней строки и конца строки, с использованием утверждений lookahead and lookbehind, например (?<=^|,) для «предшествует старт-оф-строки или ,», и (?=,|$) за «следуют , или с истекшим строки»:

String nums = ",1,,23,4,"; 
System.out.println(nums.replaceAll("(?<=^|,)(?=,|$)", "0")); 
// output: 0,1,0,23,4,0 

Или вы могли бы использовать захват группы и ссылки на группы в строке замены в переведите , в замену.Здесь $10$2 означает «первая группа, то 0, то вторая группа»:

System.out.println(nums.replaceAll("(^|,)(,|$)", "$10$2")); 
+0

Спасибо за ваш ответ. Когда я попытался либо параметр replaceAll, либо параметр text.isEmpty, я получаю ошибку исключения формата в формате, указывающую, что String пуст. –

+0

это неправильно, если мой ввод '123,, 5' ваш ответ будет' 0102030 0 050 ' –

+1

@Mohsen_Fatemi Как получается? Вы знаете, что первая строка кода не является моим ответом, но для иллюстрации того, что делает текущий код OP, правильно? Каким образом любой из двух способов, представленных в нижней части, будет производить этот вывод? –

1

я предпочитаю делать это во время чтения из CSV-файла, его стоимость намного меньше, чем делать это после чтения файла CSV, поэтому я сделать CSVReader и массив с именем Line, строка считывании строки из CSV, и если длина строки больше, чем 0 оно написано в этом режиме: 0thatstring0, в противном случае она написана как 0

CSVReader reader = new CSVReader(new FileReader("yourfile.csv")); 
String [] Line; 
while ((Line = reader.readNext()) != null) { 
    for(int i = 0 ; i < Line.length ; i++) 
     if(Line[i].length>0) System.out.println(Line[i]); 
     else System.out.println("0"); 
} 

второй метод, я не предлагаю это, использует метод разделения и spliting каждую строку с ",", сделать метод replace и он работает

+0

Хорошо использовать 'CSVReader' вместо' split'. Но вы, кажется, неправильно поняли требования. ОП не хочет, чтобы 123, 5 превращались в,0 050. Он хочет 123,0,5. Вам нужно просто напечатать 'Line [i]' if '! Line [i] .isEmpty()'. –

+0

Вы правы! я отредактирую его сейчас, спасибо –