German StringUtils.SaveCVS liste wird nicht als Stringarray erkannt

muopc

Member
Licensed User
Longtime User
Hallo an alle!

Ich habe folgenden Code, der mir einen Ordner nach Dateien durchsucht und mir deren Inhalt in eine Liste packt.

B4X:
Sub export (ex As String)
   'Vorbereitung der vars und dialog
   Dim su As StringUtils
   Dim eval As Evaluator
   eval.Initialize
   'Dim files As StringBuilder
   'sb.Initialize
   Dim head,j,files,tmplst As List
   head.Initialize
   j.Initialize
   files.Initialize
   tmplst.Initialize
   head.AddAll(Array As String("Raum","Wand+Fläche","Formel","Fläche;"))   
   Dim fd As FileDialog
   fd.ShowOnlyFolders = True
   fd.FilePath = "/mnt/sdcard"
   'fd.Show("Export nach","Ok","Abbruch","",Null)
   Dim n,o,q,r,s,t,u As String
   n = fd.FilePath
   listenfile(p & "/" & ex,False)
   'Ablauf 1.ebene dateiweise
   For i = 0 To lst.Size -1
      Dim tmp1 As String
      tmp1 = lst.Get(i)
      j = File.ReadList(p & "/" & ex,tmp1)
      'Ablauf 2.ebene Zeilenweise
      For l = 0 To j.Size -1
         Dim y As String
         y = j.Get(l)
         'Array mit Wänden erstellen
         If y.StartsWith(tmp1) Then
            files.Clear
            'r = tmp1
            files.Add(Chr(34) & tmp1 & Chr(34))
            y = y.SubString2(0,y.IndexOf("=")) 'Wand
            o = ReadIni("Formel" & y,p & "/" & ex,tmp1) 'Formel
            's = y.Replace(tmp1,"") & "(" & o & ")"
            files.Add(Chr(34) & y.SubString(y.LastIndexOf("W")) & "(" & o & ")" & Chr(34))
            x = ReadIni(y,p & "/" & ex,tmp1) 'Wert
            t = x
            files.Add(Chr(34) & x & Chr(34))
            q = NumberFormat(eval.Evaluate(x),0,2)
            u = q
            'tmplst.Add(r & s & t & u & CRLF)
            files.Add(Chr(34) & q & Chr(34)) 'Fläche berechnen
            'su.SaveCSV(n,ex & "1.csv",",",files)
            tmplst.Add(files)

         End If
         
      Next
         'Msgbox(files,"")
      File.WriteList(n,ex & ".csv",tmplst)

      
   Next
   
   Msgbox(files,"")
   'File.Writelist(n,ex & ".csv",tmplst)
   'files.Clear
   su.SaveCSV(n,ex & "1.csv",",",tmplst)

   ToastMessageShow("Export abgeschlossen",True)
End Sub

Die auskommentierten Codeteile sind versuche das ganze Irgendwie gangbar zu machen. Duplizierte Variablen dienen nur der Übersichtlichkeit beim debuggen

Beim aufrufen der vorletzten Zeile entsteht immer folgender Fehler:

B4X:
main_export (B4A line: 172)


su.SaveCSV(n,ex & "1.csv",",",tmplst)
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String[]


   at anywheresoftware.b4a.objects.StringUtils.SaveCSV2(StringUtils.java:89)
   at anywheresoftware.b4a.objects.StringUtils.SaveCSV(StringUtils.java:82)
   at aufmass.tablet.main._export(main.java:626)
   at aufmass.tablet.main._listview1_itemlongclick(main.java:939)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at anywheresoftware.b4a.BA.raiseEvent2(BA.java:167)
   at anywheresoftware.b4a.BA$2.run(BA.java:268)
   at android.os.Handler.handleCallback(Handler.java:605)
   at android.os.Handler.dispatchMessage(Handler.java:92)
   at android.os.Looper.loop(Looper.java:137)
   at android.app.ActivityThread.main(ActivityThread.java:4340)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)


   at dalvik.system.NativeStart.main(Native Method)
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String[]

Alternativ hab ichs auch geschafft, das die Exception lautet:

B4X:
java.lang.ClassCastException: java.util.String cannot be cast to java.lang.String[]

Weiß jemand warum er die Liste mit den Strings nicht als Strings oder eben Liste verarbeitet?

Für Tipps bin ich sehr dankbar.

Grüße muopc
 

kopperfeld

Member
Licensed User
Longtime User
ich versuch' mal deine Frage zu beantworten, bin mir aber nicht ganz sicher ob's stimmt.
Es scheint mir ein Problem mit falschen Datentypen zu sein:

Dim tmplst As List

..ist keine Liste aus Strings, sondern eine Liste aus Objekten. Daher funktioniert es so direkt nicht.
"File.WriteList" sollte mit dieser Liste jedoch ohne Umwege funktionieren.

"su.SaveCSV" erwartet hingegen anscheinend eine Liste aus Strings
(habe die Methode selbst noch nicht verwendet).

Daher müsstest du den Inhalt "tmplst" vorher in eine (neue) String-Liste kopieren, und dann diese mit su.SaveCSV aufrufen.
 

muopc

Member
Licensed User
Longtime User
Hallo,

danke für den Hinweis.

Ich seh keine Möglichkeit eine String-Liste zu erstellen..., allerdings war das Ergebnis von "File.WriteList" auch nicht wie gewünscht. Die Gefundenen Ergebnisse wurden in einer Zeile aneinander gereiht.

Vielleicht hatte ich da auch einen Fehler beim anfügen, aber die Funktionsbeschreibung von "files.Add" sagt ja, das es als Item am Ende angefügt wird.

"SaveCSV" erwartet an der letzten Stelle eine Liste oder ein Array, wenn ich das nicht falsch verstanden habe.

Grüße
 
Top