Что нового

Как открыть CSV-файл в Excel с форматом даннык всех столбцов как Текстовый

pvnn

Осваивающий
Сообщения
305
Репутация
32
Всем доброго времени суток. Необходима помощь.

Есть файл test.csv, привожу строчку из него
Код:
65/2008/494;КОМПЬЮТЕР;7313/45;4/45

При открытии файла вместо значения 4/45, получается апр.45

Код
Код:
#cs ----------------------------------------------------------------------------
 AutoIt Version: 3.3.8.1

 Script Function:
expression .OpenText(
            Filename,                     ; Путь к файлу
            Origin,                       ; Кодировка
            StartRow,                     ; Начинать со строки
            DataType,                     ; С Разделителями =1, без разделителей=2
            TextQualifier,                ; Двойные кавычки=1(по умолчанию), Одинарная кавычка=2,  Если (Нет)= -4142
            ConsecutiveDelimiter,         ; False Фиксированной ширины
            Tab,                          ; False Разделитель знак табуляции
            Semicolon,                    ; False Разделитель точка с запятой
            Comma,                        ; False Разделитель запятая
            Space,                        ; False Разделитель Пробел
            Other,                        ; False Разделитель Другой
            OtherChar,                    ; False Указать разделитель "|"
            FieldInfo,                    ;  Массив, содержащий информацию о столбцах данных
            TextVisualLayout,             ; Визуальное расположение текста.
            DecimalSeparator,             ; Десятичного разделителя, что Microsoft Excel использует при распознавании номера
            ThousandsSeparator,           ; Разделитель тысяч, что Excel использует при распознавании номера.
            TrailingMinusNumbers,         ; True - числа с минусом должны рассматриваться как отрицательных чисел. False или опущен, числа с минусом рассматриваются как текст
            Local)                        ; True, если региональные настройки машины должны быть использованы для сепараторов, цифр и форматирования данных.
#ce ----------------------------------------------------------------------------

#include <Excel.au3>
 $oExcel = ObjCreate('Excel.Application') ; Создать объект
 $sFilePath = @ScriptDir & '\test.csv'
 $oExcel.Workbooks.OpenText($sFilePath,1251,1,1, -4142,False,False,False,False,False,True,";")
 $oExcel.Visible = True
Exit


Помогите разобраться с параметром FieldInfo - это должен быть массив, в котором можно прописать, что все поля должны быть текстовые, но как его создать мне не понятно
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Посмотри справку по

Код:
_Excel_BookOpenText


там в первом примере этот массив формируется.


Добавлено:
Сообщение автоматически объединено:

Код:
#include <Excel.au3>
 $oExcel = ObjCreate('Excel.Application') ; Создать объект
 $sFilePath = @ScriptDir & '\test.csv'
 $aField1[2] = [1, $xlTextFormat]
 $aField2[2] = [2, $xlTextFormat]
 $aField3[2] = [3, $xlTextFormat]
 $aField4[2] = [4, $xlTextFormat]
 $aFieldInfo[4] = [$aField1, $aField2, $aField3, $aField4]
 $oExcel.Workbooks.OpenText($sFilePath,1251,1,1, -4142,False,False,False,False,False,True,";",$aFieldInfo)
 $oExcel.Visible = True
 

kokseek

Новичок
Сообщения
8
Репутация
2
может поможет...
Код:
Func F_CSV($Stroka)
	$K0 = StringInStr($Stroka, Chr(34))
	$K1 = StringInStr($Stroka, ";")
	$K2 = StringInStr($Stroka, @CR)
	$K3 = StringInStr($Stroka, @LF)
	If $K0 <> 0 Then
		$strokatmp = $Stroka
		$Stroka = ""
		$PoiskK = 0
		For $i = 1 To StringLen($strokatmp)
			If StringMid($strokatmp, $i, 1) = Chr(34) Then
				$PoiskK = $PoiskK + 1
				If Mod($PoiskK, 2) = 0 Then
					$Stroka &= "»"
				Else
					$Stroka &= "«"
				EndIf
			Else
				$Stroka &= StringMid($strokatmp, $i, 1)
			EndIf
		Next
	EndIf
	If $K1 + $K2 + $K3 <> 0 Then $Stroka = Chr(34) & $Stroka & Chr(34)
	Return $Stroka
EndFunc   ;==>F_CSV
;--------------------------------------------------------------------------------

Func VigruzkaCsv()
	Local $hQuery, $aRow, $aNames, $StrTree, $_NameFirm, $_Gor, $_Tel, $_WWW, $file, $Line, $SQLSTR, $NumF = 0
	FileDelete(@ScriptDir & "\VIGRUZKA\*.csv")
	;Tablici razdelov
	FileDelete(@ScriptDir & "\VIGRUZKA\*.xml")
	_SQLite_Query($db, "SELECT * FROM STree order by SortTree ;", $hQuery)
	$StrTree = ""
	While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
		If $aRow[4] = 1 Then
			$NumF = $NumF + 1
			$AdresTree = StringFormat("%03d", $NumF) & "_" & StringReplace(StringMid($StrTree, 1, StringInStr($StrTree, "@", 0, $aRow[2]) - 1), "@", "!") & "_" & $aRow[6]
			SaveCsv($aRow, $AdresTree)
		Else
			$StrTree = StringMid($StrTree, 1, StringInStr($StrTree, "@", 0, $aRow[2])) & $aRow[6] & "@"
		EndIf
	WEnd
	;Spisok firm
	$NumF = $NumF + 1
	$file = FileOpen(@ScriptDir & "\VIGRUZKA\" & StringFormat("%03d", $NumF) & "_Информация_Список организаций, разместивших информацию в текущем номере.csv", 10)
	$Line = "Название организации;Город;Телефоны;WWW"
	FileWriteLine($file, $Line)
	$SQLSTR = "SELECT t2.Name, t2.FormaS , t1.Reg, t1.Tel,t2.Adres , t1.GlavOfis FROM FirmsInfo t1 " & _
			"INNER JOIN Firms t2 on t2.IdFirm = t1.IdFirm " & _
			"ORDER BY t2.Name,t2.FormaS,t1.GlavOfis desc;"
	_SQLite_Query($db, $SQLSTR, $hQuery)
	While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
		If $aRow[5] = 1 Then
			$_NameFirm = $aRow[0]
			If StringLen(StringStripWS($aRow[1], 8)) <> 0 Then $_NameFirm &= ", " & $aRow[1]
			$_WWW = $aRow[4]
		Else
			$_NameFirm = ""
			$_WWW = ""
		EndIf
		$_Gor = $aRow[2]
		$_Tel = StringReplace(StringReplace(StringStripWS($aRow[3], 8), ",", Chr(10)), ")", ") ")
		$Line = F_CSV($_NameFirm) & ";" & F_CSV($_Gor) & ";" & F_CSV($_Tel) & ";" & F_CSV($_WWW)
		FileWriteLine($file, $Line)
	WEnd
	FileClose($file)
	;Info o kolichestve strok
	$NumF = $NumF + 1
	Local $file = FileOpen(@ScriptDir & "\VIGRUZKA\" & StringFormat("%03d", $NumF) & "_Информация_Информация о количестве рекламных строк.csv", 10)
	$Line = "<< Информация о количестве рекламных строк >>" & @CRLF & "<Наименование>" & ";" & "<Количество>"
	FileWriteLine($file, $Line)
	$SQLSTR = "SELECT 'ВСЕГО СТРОК : ', sum(1) FROM InfoStroki t1  " & _
			"INNER JOIN STree t2 on t2.Id = t1.IdRazdel " & _
			"where t1.IdRazdel = t2.Id;"
	_SQLite_QuerySingleRow($db, $SQLSTR, $aRow)
	$Line = F_CSV($aRow[0]) & ";" & F_CSV($aRow[1])
	FileWriteLine($file, $Line)
	FileWriteLine($file, ";" & @CRLF & "* По Таблицам *")
	$SQLSTR = "SELECT t2.Name, sum(1) FROM InfoStroki t1  " & _
			"INNER JOIN STree t2 on t2.Id = t1.IdRazdel " & _
			"where t1.IdRazdel = t2.Id group by t2.name;"
	_SQLite_Query($db, $SQLSTR, $hQuery)
	While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
		$Line = F_CSV($aRow[0]) & ";" & F_CSV($aRow[1])
		FileWriteLine($file, $Line)
	WEnd
	FileWriteLine($file, ";" & @CRLF & "* По Фирмам *")

	$SQLSTR = "SELECT t1.FirmFullName, sum(1) FROM InfoStroki t1  " & _
			"INNER JOIN STree t2 on t2.Id = t1.IdRazdel " & _
			"where t1.IdRazdel = t2.Id group by t1.FirmFullName;"
	_SQLite_Query($db, $SQLSTR, $hQuery)
	While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
		$Line = F_CSV($aRow[0]) & ";" & F_CSV($aRow[1])
		FileWriteLine($file, $Line)
	WEnd
	FileClose($file)
	;
	If $NameInputFile <> "" Then
		If Number(StringMid($NameInputFile, 2, 12)) > 201100000000 Then
			$DF = StringMid($NameInputFile, 2, 12)
		Else
			$DF = @YEAR & @MON & @MDAY & @HOUR & @MIN
		EndIf
	Else
		$DF = @YEAR & @MON & @MDAY & @HOUR & @MIN
	EndIf
	;RunWait(@ComSpec & " /c " & @ScriptDir & "\rar.exe a -df -y -ep " & @ScriptDir & "\VIGRUZKA\T" & $DF & ".rar " & @ScriptDir & "\VIGRUZKA\*.csv", '', @SW_HIDE)
EndFunc   ;==>VigruzkaCsv

;--------------------------------------------------------------------------------

Func SaveCsv($Info, $AdresTree)
	Local $SQLSTR, $aResult, $iRows, $iColumns, $i, $r, $C
	Local $Line = ""
	Local $file = FileOpen(@ScriptDir & "\VIGRUZKA\" & $AdresTree & ".csv", 10)
	If $file = -1 Then Return 0
	;Propisivaem shapku
	$Line = ""
	For $i = 8 To 24 Step 2
		If StringStripWS($Info[$i], 8) <> "" Then
			$Line &= ";" & F_CSV($Info[$i])
		EndIf
	Next
	For $i = 26 To 30
		If StringStripWS($Info[$i], 8) <> "" Then
			$Line &= ";" & F_CSV($Info[$i])
		EndIf
	Next
	$Line = StringRight($Line, StringLen($Line) - 1)
	FileWriteLine($file, $Line)
	;Sortiruyu i Zapolnyayu fayl esli est chem
	$SQLSTR = ""
	For $i = 8 To 24 Step 2
		If StringStripWS($Info[$i], 8) <> "" Then
			$SQLSTR &= ", Pole" & ($i - 6) / 2
		EndIf
	Next
	If StringStripWS($Info[26], 8) <> "" Then $SQLSTR &= ", Cena"
	If StringStripWS($Info[27], 8) <> "" Then $SQLSTR &= ", RegionNum"
	If StringStripWS($Info[28], 8) <> "" Then $SQLSTR &= ", RegionName"
	If StringStripWS($Info[29], 8) <> "" Then $SQLSTR &= ", Tel"
	If StringStripWS($Info[30], 8) <> "" Then $SQLSTR &= ", FirmName"
	$SQLSTR = "SELECT " & StringRight($SQLSTR, StringLen($SQLSTR) - 1) & " FROM InfoStroki WHERE IdRazdel = " & $Info[0] & " ORDER BY sortv1, sortv2, sortv3, sortv4, sortv5, sortv6, sortv7, sortv8, sortv9, sortv10 ;"
	If _SQLite_GetTable2d($db, $SQLSTR, $aResult, $iRows, $iColumns) = $SQLITE_OK Then
		For $r = 1 To UBound($aResult, 1) - 1
			$Line = ""
			For $C = 0 To UBound($aResult, 2) - 1
				$Line &= ";" & F_CSV($aResult[$r][$C])
			Next
			$Line = StringRight($Line, StringLen($Line) - 1)
			FileWriteLine($file, $Line)
		Next
	EndIf
	FileClose($file)
	Return 1
EndFunc   ;==>SaveCsv
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
C2H5OH,
Сделал по аналогии, но все равно не работает

Код:
#include <Array.au3>
 #include <Excel.au3>

 $oExcel = ObjCreate('Excel.Application') ; Создать объект
 $sFilePath = @ScriptDir & '\test.csv'

 $xlTextFormat=2

Local $aField1[2] = [1, $xlTextFormat]
Local $aField2[2] = [2, $xlTextFormat]
Local $aField3[2] = [3, $xlTextFormat]
Local $aField4[2] = [4, $xlTextFormat]
Local $aFieldInfo[4] = [$aField1, $aField2, $aField3, $aField4]
$oExcel.Workbooks.OpenText($sFilePath,1251,1,1, -4142,False,False,False,False,False,True,";",$aFieldInfo)
$oExcel.Visible = True


Проверил AutoIt Version: 3.3.12.0 функцию _Excel_BookOpenText
Тоже не работает.

Заработало, когда поменял расширение файла с csv на txt
Это что, мне придется сначала поменять расширение, а потом обрабатывать?
Это нормально? или я что-то не учел?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Да, прикольно. :smile:

pvnn, но это же проблема не AutoIt, а метода OpenText.
Уверен, если ты напишешь аналогичный код на каком-нибудь распространённом ЯП, то получишь тот же эффект - один и тот же файл данных будет обрабатываться по разному в зависимости от расширения которое ты ему поставишь.
:shok:


Добавлено:
Сообщение автоматически объединено:

В подтверждение того что метод OpenText далёк от совершенства, могу добавить ещё вот такой скрипт
Код:
#include <Excel.au3>
 $oExcel = ObjCreate('Excel.Application') ; Создать объект
 $sFilePath = @ScriptDir & '\test.txt'
 Local $aField1[2] = [1, $xlTextFormat]
 Local $aField4[2] = [4, $xlTextFormat]
 Local $aFieldInfo[2] = [$aField1, $aField4]

 $oExcel.Workbooks.OpenText($sFilePath,1251,1,1, -4142,False,False,False,False,False,True,";", $aFieldInfo)
 $oExcel.Visible = True


Он тоже не даёт ожидаемого результата, хотя правила использования $aFieldInfo не нарушены.
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
В общем, можно считать, что тема решена

Спасибо C2H5OH за пример составления массива FieldInfo
 
Верх