Чтение длинных данных из CSV - PullRequest
0 голосов
/ 07 декабря 2010

У меня есть файл CSV, я читаю его элементы из файла

каждая строка преобразуется в список, один из столбцов представляет собой длинные данные, но Java читает его в

2.01005E + 14, и я не могу преобразовать его в long. Есть ли способ преобразовать только это значение в long?

Значение CSV 201005300149580.код, мой класс CSV

 package com.gta.moneyb.util;

import java.util.ArrayList;
import java.util.List;

public class CSV {

   public static final char DEFAULT_SEP = ',';

   /** Construct a CSV parser, with the default separator (`,'). */
   public CSV() {
     this(DEFAULT_SEP);
   }

   /** Construct a CSV parser with a given separator. 
    * @param sep The single char for the separator (not a list of
    * separator characters)
    */
   public CSV(char sep) {
     fieldSep = sep;
   }

   /** The fields in the current String */
   protected List<String> list = new ArrayList<String>();

   /** the separator char for this parser */
   protected char fieldSep;

   /** parse: break the input String into fields
    * @return java.util.Iterator containing each field 
    * from the original as a String, in order.
    */
   public List<String> parse(String line)
   {
     StringBuffer sb = new StringBuffer();
     list.clear();      // recycle to initial state
     int i = 0;

     if (line.length() == 0) {
       list.add(line);
       return list;
     }

     do {
             sb.setLength(0);
             if (i < line.length() && line.charAt(i) == '"')
                 i = advQuoted(line, sb, ++i);  // skip quote
             else
                 i = advPlain(line, sb, i);
             list.add(sb.toString());
       i++;
     } while (i < line.length());

     return list;
   }

   /** advQuoted: quoted field; return index of next separator */
   protected int advQuoted(String s, StringBuffer sb, int i)
   {
     int j;
     int len= s.length();
         for (j=i; j<len; j++) {
             if (s.charAt(j) == '"' && j+1 < len) {
                 if (s.charAt(j+1) == '"') {
                     j++; // skip escape char
                 } else if (s.charAt(j+1) == fieldSep) { //next delimeter
                     j++; // skip end quotes
                     break;
                 }
             } else if (s.charAt(j) == '"' && j+1 == len) { // end quotes at end of line
                 break; //done
       }
       sb.append(s.charAt(j));  // regular character.
     }
     return j;
   }

   /** advPlain: unquoted field; return index of next separator */
   protected int advPlain(String s, StringBuffer sb, int i)
   {
     int j;

     j = s.indexOf(fieldSep, i); // look for separator
         if (j == -1) {                 // none found
             sb.append(s.substring(i));
             return s.length();
         } else {
             sb.append(s.substring(i, j));
             return j;
         }
     }
 }

Ответы [ 4 ]

1 голос
/ 07 декабря 2010

Я бы всегда рекомендовал использовать CSVReader для сложной задачи анализа и создания CSV-файлов.

1 голос
/ 07 декабря 2010

Для анализа строки, содержащей long, вам нужно использовать Long.parseLong ()

String text = "201005300149580";
long number = Long.parseLong(text);
0 голосов
/ 07 декабря 2010

Длинна должна быть правильной в памяти.Вы видите его неправильно при печати. ​​
Используйте DecimalFormat с вашим предпочтительным форматом, чтобы преобразовать его в строку, и вы увидите это правильно

0 голосов
/ 07 декабря 2010

Проблема с CSV-файлом, я создал CSV-файл в Блокноте с указанными выше значениями, и они подходят

...