Hier mal ein Beispiel.
Beiträge von Scritch
-
-
Hallo,
ich wollte gerne eine CSV-Datei in ein Array einlesen.
Dazu habe ich dies hier gefunden:Spoiler anzeigen
[autoit]#include <array.au3>
[/autoit] [autoit][/autoit] [autoit]
Main()Func Main()
[/autoit] [autoit][/autoit] [autoit]
Local $sAdr = "C:\\test.csv"
Local $h = FileOpen($sAdr, 0)Local $aRet = _CSV2Array($h, Default, True, 1)
[/autoit] [autoit][/autoit] [autoit]FileClose($h)
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($aRet)EndFunc ;==>Main
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; #FUNCTION# ===================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name ..........: _CSV2Array
; Description ...:
; AutoIt Version : V3.3.0.0
; Syntax ........: _CSV2Array($hFile[, $cSeperator = "auto"[, $bFilterString = True[, $iColumnMode = 0]]])
; Parameter(s): .: $hFile - Handle for the CSV file to Read
; $cSeperator - Optional: (Default = "auto") : Tries to find the separator char
or , or TAB or | or space)
; | Data-seperator-char
; | Empty-string = Opt("GUIDataSeparatorChar")
; $bFilterString - Optional: (Default = True) : Removes leading and trailing " or '
; $iColumnMode - Optional: (Default = 0) :
; | 0: Sets error if lines have different columns and @extended to the csv-line number
; | 1: returns lines with different columns numbers comparing to the first line, too
; | 2: removing all columns > column numbers in the first line
; Return Value ..: Success - 2-dim Array
; Failure - 0
; @ERROR - 1: error file read
; @ERROR - 2: different number of columns / @EXTENDED = CSV-line
; - 3: parameter error
; Author(s) .....: Thorsten Willert
; Date ..........: Mon Dec 07 18:54:35 CET 2009
; ==============================================================================
Func _CSV2Array($hFile, $cSeperator = "auto", $bFilterString = True, $iColumnMode = 0)
Local $s = FileRead($hFile)
If @error Then Return SetError(1)If $cSeperator = Default Then $cSeperator = "auto"
[/autoit] [autoit][/autoit] [autoit]
If Not $cSeperator Then $cSeperator = Opt("GUIDataSeparatorChar"); searching the line-seperator and splitting the lines into an array
[/autoit] [autoit][/autoit] [autoit]
Local $aLines
If StringInStr($s, @CRLF) Then
$aLines = StringSplit($s, @CRLF, 1)
ElseIf StringInStr($s, @CR) Then
$aLines = StringSplit($s, @CR)
Else
$aLines = StringSplit($s, @LF)
EndIf; searching the delimiter in the first line
[/autoit] [autoit][/autoit] [autoit]
Local $aTMP
If $cSeperator = "auto" Then
Local $iMax = 0
Local $iC[5] = [0, 0, 0, 0, 0]
Local $sC[5] = [";", ",", @TAB, "|", " "]$aTMP = StringRegExp($aLines[1], ";", 3)
[/autoit] [autoit][/autoit] [autoit]
If Not @error Then $iC[0] = UBound($aTMP)
$aTMP = StringRegExp($aLines[1], ",", 3)
If Not @error Then $iC[1] = UBound($aTMP)
$aTMP = StringRegExp($aLines[1], "\t", 3)
If Not @error Then $iC[2] = UBound($aTMP)
$aTMP = StringRegExp($aLines[1], "\|", 3)
If Not @error Then $iC[3] = UBound($aTMP)
$aTMP = StringRegExp($aLines[1], "[ ]", 3)
If Not @error Then $iC[4] = UBound($aTMP)For $i = 0 To UBound($sC) - 1
[/autoit] [autoit][/autoit] [autoit]
If $iC[$i] > $iMax Then
$iMax = $iC[$i]
$cSeperator = $sC[$i]
EndIf
Next
EndIf; creating 2-dim array based on the number of data in the first line
[/autoit] [autoit][/autoit] [autoit]
$aTMP = StringSplit($aLines[1], $cSeperator)
Local $iCol = $aTMP[0]
Local $aRet[$aLines[0]][$iCol]; splitting and filling the lines
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $aLines[0]
$aTMP = StringSplit($aLines[$i], $cSeperator)
If @error Then ContinueLoop
If $aTMP[0] > $iCol Then
Switch $iColumnMode
Case 0
Return SetError(2, $i)
Case 1
ReDim $aRet[$aLines[0] - 1][$aTMP[0]]
Case 2
$aTMP[0] = $iCol
Case Else
Return SetError(3)
EndSwitch
EndIf
For $j = 1 To $aTMP[0]
$aTMP[$j] = StringStripWS($aTMP[$j], 3)
If $bFilterString Then ; removing leading and trailing " or '
$aTMP[$j] = StringRegExpReplace($aTMP[$j], '^("|'')(.*?)\1$', '$2')
EndIf
$aRet[$i - 1][$j - 1] = $aTMP[$j]
Next ; /cols
Next ; /linesReturn $aRet
[/autoit]
EndFunc ;==>_CSV2Array
Funktioniert soweit auch ganz ok - zum Teil immerhin.
Lese ich eine .csv mit einer Zeilenanzahl von 20 und
Spaltenanzahl von 20 ein, klappt es einwandfrei.Wenn die .csv allerdings über 100 Zeilen und 3 Spalten
umfasst, gibs da in dem Array Chaos. Der Inhalt der Zeilen
und Spalten wird zwar auch 100 Zeilen verteilt, allerdings
auch auf 7 Spalten. Ausserdem werden die ";" mit hinein-
geschrieben...Fehler in der Funktion?
Gibs da noch andere Möglichkeiten außer die genannte?
-
Alles klar, danke. Das wars nicht alleine. Habe da noch einen anderen Fehler in meinem Script gefunden.
-
Hallöchen
hoffe ihr hattet ein angenehmes Weekend
Bin noch zurück, was das ursprüngliche Problem betrifft.
Also, nur indirekt, wollte deswegen aber keinen neuen Thread aufmachen.Und zwar möchte ich den Pfad wo eine Date gelöscht wurde, in eine
Logdatei schreiben.Habs erst so probiert:
Spoiler anzeigen
[autoit]#include "_GetFilesFolder_Rekursiv.au3"
[/autoit]
#include <Filese.au3>
$a345 = _GetFilesFolder_Rekursiv("D:\", "345", 0)
For $i = 1 To $a345[0]
if not StringInStr($a345[$i],"D:\nicht löschen\") then
_FileWriteLog(@ScriptDir & "\log.txt", $a345[$i] & @CRLF)
FileDelete($a345[$i])
EndIf
NextFunktioniert nicht.
Dann so:
Spoiler anzeigen
[autoit]#include "_GetFilesFolder_Rekursiv.au3"
[/autoit]
#include <Filese.au3>
$a345 = _GetFilesFolder_Rekursiv("D:\", "345", 0)
For $i = 1 To $a345[0]
if not StringInStr($a345[$i],"D:\nicht löschen\") then
_FileWriteFromArray(@ScriptDir & "\log.txt", $a345]$i])
FileDelete($a345[$i])
EndIf
Next
Funktioniert auch nicht.Der Pfad steht aber schon im Array, oder?

Also, möchte immer nur das in die Logdatei schreiben, was auch gelöscht wurde.
-
Hey,
so, habe deines gerade mal ausprobiert m-obi. Das funktioniert genau so, wie es soll. Vielen Dank dafür

Auch vielen Dank an alle anderen die so viel Geduld aufgebracht haben
-
Genau das, SEuBo
Danke dir! -
Ich kann mit ArrayDelte() ein spezifiziertes Element aus einem Array löschen.
Aber kann ich auch eine ganze Spalte löschen? -
Was ist das denn fürn Crap? Ganz ehrlich
Man kann doch sicher Zeile und Spalte 1 aus einem Array löschen...mal schauen...
Danke ersmtal.
-
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <File.au3>
#include <excel_gr.au3>Local $obeispiel = _ExcelBookOpen(@ScriptDir & "\beispiel.xlsx", 1, False, "", "")
[/autoit]
Local $abeispiel = _ExcelReadSheetToArray($obeispiel, 1, 1)
_ExcelBookClose($obeispiel)
_ArrayDisplay($abeispiel) -
Moin,
beim Einlesen einer Exceltabelle, mit sagen wir 19 Zeilen und 3 Spalten, in ein Array
wird die Anzahl von Spalten und Zeilen mit in das Array geschrieben.Das ist nicht das alleinige Problem: Die erste Spalte ist komplett frei,
sodass es quasi ein 4 spaltiges Array wird.Wie kann das sein?
Ich habe norlich die include schon verändert, weil das Skript immer in einen
Fehler lief. Muss da noch was geändert werden? Geändert habe ich einfach nur
2 Buchstaben, die im englischen anders waren...So siehts aus:
-
Naja, die Sache mit dem Knoten: Für einen Anfänger gar nicht so einfach.
Vor allem wirds zum Ende nicht unbedingt leichter verständlicher
Ich versuchs ja zu verstehen... -
And the winner iiiiiiiiiiiiisssssssssss: Ezzora. GZ

Ne, danke nochmal an dieser Stelle für eure Hilfe
-
JEtzt nervst langsam, obn hab ich dir eine funktionierende gemacht und nun willste doch ne andere -.-Sorry, habe ich nicht gemacht um dich zu ärgern. Wollt halt nicht, dass ihr euch eure Köppe noch einschlag

-
Da habe ich ja was angerichtet
Danke für eure Gedanken zu meinem Problem.
Ich dachte mir jetzt aber, dass ich etwas umstrukturiere.
Ich bräuchte die UND-Verknüpfung nicht. Die eine Datei
kann ich auch so sichern, dass sie nicht gelöscht wird.Aber selbst eine einfach Abfrage klappt bei mir nicht.
Das ist doch zum Mäuse melken
Dieses eine Verzeichnis soll stehen bleiben. Nichts weiter.
[autoit]#include "_GetFilesFolder_Rekursiv.au3"
[/autoit][autoit][/autoit][autoit]$a345 = _GetFilesFolder_Rekursiv("d:\", "345", 0)
[/autoit][autoit][/autoit][autoit]For $i = 1 To $a345
[/autoit]
if $a345[$i] = "D:\nicht löschen\*.345" then
FileDelete($a345[$i])
EndIf
Next -
Moin,
gerade ausprobiert, aber selber Fehler wie vorher. Beendet sich bevor die Schleife durchlaufen wird,
und es wird nichts in die log.txt geschrieben.Mal was anderes:
Spoiler anzeigen
[autoit]Local $sOut = ''
[/autoit]
For $i = 0 To UBound($Files2d) - 1
_ArraySearch($anegativliste, $Files2d[$i][0], 0, 0, 1, 1)
If @error Then
_ArraySearch($areferenz, $Files2d[$i][0], 0, 0, 1, 1)
If @error Then
$sOut &= $Files2d[$i][0] & ' ' & $Files2d[$i][1] & ' ' & $Files2d[$i][2] & @CRLF
EndIf
EndIf
Next
Kann es nicht einfach sein, dass man bei $anegativliste und $areferenz auch einfach die größe
mit angeben muss? -
Habs gerade nochmal geprüft, scheint alles zu stimmen. Die UND-Verknüpfung spinnt allerdings irgendwie.
"If Keyword must have a thenstatement"
Wenn ich allerdings das nach dem and wegnehmen, Funktionierts auch nicht. Er löscht gar nichts.Spoiler anzeigen
[autoit]#include "_GetFilesFolder_Rekursiv.au3"
[/autoit] [autoit][/autoit] [autoit]
$a345 = _GetFilesFolder_Rekursiv("d:\", "345", 0)For $i = 1 To $a345
[/autoit]
if not $a345[$i]="D:\nicht löschen\1.345" and if not $a345[$i]="D:\nicht2\2.345" then
FileDelete($a345[$i])
EndIf
Next -
Das wäre die AND-Verknüpfung.
Ist ja quasi das, was ich gesagt habe. Funktionrt nur genauso wenig
Wenn ich die Bedingung orweg schreibe, werden gar keine Dateien gelöscht
-
Hi,
achso, das mit den .xlsx-Dateien ist mein Fehler. Hatte die gestern neu
erstellt und nicht dran gedacht in .xls umzuformatieren.Zu deiner anderen Frage, bzw. Annahme. Nein, es soll nicht nur die erste Spalte kontrolliert werden.
Ich versuchs nochmal:
(Shema für die Tabelle: Spalte1 Spalte2 Spalte3)Array $Files2d 1. Zeile: LaufenderDienst Enabled Wahr wird verglichen mit Array $anegativliste : Allerdings ist der Eintrag so nicht vorhanden, d. h. es steht in keiner Zeile des Dokuments, bzw. des Arrays $anegativliste LaufenderDienst Enabled Wahr. So, nun wird in $areferenz nach dieser Zeile gesucht. Also, steht irgendwo in $areferenz in irgendeiner Zeile LaufenderDienst Enabled Wahr genauso da, ist es ok. Dann wird mit der nächsten Zeile und den 3 Elementen aus $Files2d weitergemacht.
Ist der Eintrag LaufenderDienst Enabled Wahr nicht haargenau so in $areferenz vorhanden, wird die zu suchende Zeile und deren 3 Elemente in "log.txt" geschrieben.
Dies geschieht auch, wenn z. B. Der Eintrag in folgender Kombination in $areferenz vorhanden ist: LaufenderDienst Enabled Falsch. Also, es soll nicht erst die 1. Spalte komplett, dann die 2 Spalte komplett usw. miteinander verglichen werden. Sondern Zeile für Zeile.Da schaut die func in dem moment in die Excel datei und gib das wieder was da steht. Ist wahrscheinlich nicht richtig oder??
Nene, die gibt nur den Suchbegriff aus $Files2d wieder, der in beiden Exceldateien bzw. deren Arrays nicht gefunden wurde. Und das schreibt er halt in die log.txt
-
Verdammt. Ja, stimmt. Das mit dem Array war unüberlegt.
War da irgendwie noch bei Batch gerade, als ichs geschrieben habe
[autoit]Not $a345[$i] = "d:\nicht löschen\" Then
[/autoit]
Das soll eine typische NAND-Verknüpfung sein, wenn man das so nennen kann.
Nur wenn beides Nicht wahr ist, dann soll die Datei die in $a345[$i] gerade steht
gelöscht werden...Oder mache ich da einen Denkfehler?
-
Hmmm... was?
[autoit]
WiesoStringRegExe
[/autoit]
?
Ein Array hatte ich ja zuerst, brauchte ich dann aber doch nicht.Hätte eig. gedacht, dass es so jetzt funktioniert:
Spoiler anzeigen
[autoit]#include "_GetFilesFolder_Rekursiv.au3"
[/autoit]
$a345 = _GetFilesFolder_Rekursiv("d:\", "345", 0)
For $i = 1 To $a345[0]
If Not [$i] = "d:\nicht löschen.345" Then
If Not [$i] = "d:\nicht löschen\" Then
FileDelete($a345[$i])
EndIf
EndIf
Next
Pustekuchen.
"Line 4 - Error in Expression"
Was ist an "If Not [$i] = "d:\nicht löschen.345" Then" verkehrt? :pinch: