2010-02-11 6 views
2

J'ai la chaîne "MO""RET" est stockée dans items[1] tableau après la commande split. Après avoir été stocké, je fais un replaceall sur cette chaîne et il remplace toutes les guillemets. Mais je veux qu'il soit stocké comme MO"RET. Comment fait-on ça. Dans le fichier csv à partir duquel je traite en utilisant la commande fractionnée Les guillemets doubles dans le contenu d'un champ Texte sont répétés (Exemple: Ce compte est un ""large"" un "). Donc je veux conserver l'une des deux guillemets au milieu de la chaîne si il get répété et ignorer les citations de fin si elles sont présentes Comment puis-je faireEn ce qui concerne la manipulation de chaînes Java

String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); 
items[1] has "MO""RET" 
String recordType = items[1].replaceAll("\"",""); 

Après cette recordType a MORET Je veux qu'il y ait MO"RET

+4

Il ya moins d'une heure, vous avez posté une question très similaire http://stackoverflow.com/questions/2241758/regarding-java-split-command-parsing-csv-file auquel vous n'avez pas répondu, désactivé ou élevé. ou accepté. Si vous ne donnez pas au site, les gens cesseront de vous donner. –

+1

@ Mark Byers: oh, comme je voudrais que ce soit vrai. – danben

Répondre

1

Que diriez-vous.?

String recordType = items[1].replaceAll("\"\"", "\""); 
+0

Merci beaucoup. Dans le cas où la chaîne a une valeur de "TEST" REPLA "S'il n'y a qu'un seul double guillemet au milieu de la chaîne, comment puis-je supprimer la première, dernière citation et conserver toute la citation du milieu. comme TEST "REPLA Exemple 2:" EXAM "PLE" 2IN "Je veux la sortie comme EXAM" PLE "2IN Les premières et dernières citations doivent être supprimées – Arav

+0

Il est difficile de faire cela avec regex et de couvrir le cas où il y en a un départ devis et pas de fin de citation, etc. Et la regex commence à devenir vraiment compliqué. Vous commencez vraiment à mieux analyser la ligne entière. Si vous voulez juste le cas spécifique de début/fin de citation, vérifiez simplement ceci avec charAt() et faites une sous-chaîne. Ce sera plus rapide que regex quand même. – PSpeed

6

Don n'utilisez pas regex t o diviser une ligne CSV. C'est demander des ennuis;) Il suffit de l'analyser caractère par caractère. Voici un exemple:

public static List<List<String>> parseCsv(InputStream input, char separator) throws IOException { 
    BufferedReader reader = null; 
    List<List<String>> csv = new ArrayList<List<String>>(); 
    try { 
     reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); 
     for (String record; (record = reader.readLine()) != null;) { 
      boolean quoted = false; 
      StringBuilder fieldBuilder = new StringBuilder(); 
      List<String> fields = new ArrayList<String>(); 
      for (int i = 0; i < record.length(); i++) { 
       char c = record.charAt(i); 
       fieldBuilder.append(c); 
       if (c == '"') { 
        quoted = !quoted; 
       } 
       if ((!quoted && c == separator) || i + 1 == record.length()) { 
        fields.add(fieldBuilder.toString().replaceAll(separator + "$", "") 
         .replaceAll("^\"|\"$", "").replace("\"\"", "\"").trim()); 
        fieldBuilder = new StringBuilder(); 
       } 
       if (c == separator && i + 1 == record.length()) { 
        fields.add(""); 
       } 
      } 
      csv.add(fields); 
     } 
    } finally { 
     if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} 
    } 
    return csv; 
} 

Oui, il y a peu de regex en cause, mais seulement les garnitures de séparation et de fin guillemets autour d'un seul champ.

Vous pouvez toutefois également saisir une tierce partie Java CSV API.

+0

Merci beaucoup. Merci beaucoup. Dans le cas où la chaîne my a une valeur de "TEST" REPLA ".S'il n'y a qu'une seule double citation au milieu de la chaîne, comment puis-je supprimer la première, dernière citation et conserver toutes les citation du milieu. Je veux la sortie comme TEST "REPLA Exemple 2:" EXAM "PLE" 2IN "Je veux la sortie comme EXAMEN" PLE "2IN Les premières et dernières citations doivent être supprimées – Arav

+1

L'exemple de code posté le fait déjà (en supposant que votre Fichier CSV adhère à la RFC4180 comme indiqué ici http://www.rfc-editor.org/rfc/rfc4180.txt) – BalusC

+0

J'ai utilisé votre code .. Great! Humm ... Il y a un petit problème. A "," B "," "," "]' de la ligne 'A, B ,,' du fichier exporté de la feuille de calcul, mais j'ai '' ["A", "B", ""] '' '' –

0

Je préfère que vous utilisiez replace au lieu de replaceAll. replaceAll utilise REGEX comme premier argument.

L'exigence est de remplacer deux continue CITATIONS avec un QUOTE

String recordType = items[1].replace("\"\"", "\""); 

Pour voir la différence entre les remplacer et replaceAll, le code ci-dessous execute

recordType = items[1].replace("$$", "$"); 
recordType = items[1].replaceAll("$$", "$"); 
+0

Merci beaucoup.Si la chaîne a une valeur de "TEST" REPLA ". S'il n'y a qu'une seule double citation au milieu de la chaîne, comment puis-je supprimer la première, dernière citation et conserver toutes les citation du milieu. Je veux la sortie comme TEST "REPLA Exemple 2:" EXAM "PLE" 2IN "Je veux la sortie comme EXAM" PLE "2IN Les premières et dernières citations doivent être supprimées – Arav

0

Ici, vous pouvez utiliser l'expression régulière.

recordType = items[1].replaceAll("\\B\"", ""); 
recordType = recordType.replaceAll("\"\\B", ""); 

Première instruction remplacez les guillemets au début du mot par un caractère vide. Deuxième instruction remplace les guillemets à la fin du mot par un caractère vide.