Copiar texto que inicie con " y termine con " unicamente

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
diego999
Mensajes: 15
Registrado: 07 Sep 2014, 11:23

Copiar texto que inicie con " y termine con " unicamente

Mensaje por diego999 »

Hola ,necesito copiar el texto de cada fila que esta dentro de un documento,y que inicia y termina con comillas,por ejemplo:

1 cualquier cosa "texto texto";
2 asdsdsd "texto texto texto";
3 1212jhjjh "texto";


Es decir,que copie cada texto que esta entre comillas,unicamente,y que lo pase a una hoja de exel para quedar asi:

1 "texto texto"
2 "texto texto texto"
3 "texto"

Como podria hacerlo?,ya estoy buscando la manera de hacerlo,pero necesito una guia...
PDF
Hacker del Foro
Mensajes: 152
Registrado: 18 Ene 2013, 23:23

Re: Copiar texto que inicie con " y termine con " unicamente

Mensaje por PDF »

Puedes usar _StringBetween para no usar expresiones regulares,
junto con _Excel_RangeWrite..

Mira esta UDF tambien te puede servir ya que _StringBetween devuelve un array conteniendo las coincidencias..

Saludos
PDF
Hacker del Foro
Mensajes: 152
Registrado: 18 Ene 2013, 23:23

Re: Copiar texto que inicie con " y termine con " unicamente

Mensaje por PDF »

Bueno, aqui te dejo un ejemplo sencillo utilizando _ArrayToXLS:

Código: Seleccionar todo

#include <Array.au3>
#include <File.au3>
#include <WinAPI.au3>
#include <String.au3>

Local $cadena='1 cualquier cosa "texto texto";	2 asdsdsd "texto texto texto";	3 1212jhjjh "texto";'


Local $aArray = _StringBetween($cadena,'"','"',1,1) ;Extraemos las cadenas que se encuentran entre comillas

 _ArrayDisplay($aArray) ;Esto es solo para ver el contenido de $aArray

_ArrayToXLS($aArray, @ScriptDir & '\test1.xls')


ShellExecute(@ScriptDir & '\test1.xls')


; #FUNCTION# ====================================================================================================================
; Name...........: _ArrayToXLS
; Description ...: Places the elements of an 1D or 2D array into an Excel file (XLS).
; Syntax.........: _ArrayToXLS(Const ByRef $avArray, $sFileName[, $Transpose = False[, $iStartRow = 0[, $iEndRow = 0[, $iStartCol = 0[, $iEndCol = 0]]]]])
; Parameters ....: $avArray - Array to save
;               $sFileName  - Full path to XLS file
;               $Transpose  - [optional] At 2D array changes rows and columns
;               $iStartRow  - [optional] Zero based index (row) of array to start saving at
;               $iEndRow    - [optional] Zero based index (row) of array to stop saving at, if zero then last row is taken
;               $iStartCol  - [optional] Zero based index (column) of array to start saving at
;               $iEndCol    - [optional] Zero based index (column) of array to stop saving at, if zero then last column is taken
; Return values .: Success - 1
;               Failure - 0, sets @error:
;               |1 - $avArray is not an array
;               |2 - $avArray is not 1D/2D array
;               |3 - $iStartRow is greater than $iEndRow
;               |4 - $iStartCol is greater than $iEndCol
;               |5 - couldn't create XLS file
; Author ........: Zedna
; Modified.......:
; Remarks .......: Function supports 1D and 2D arrays. All array's data are converted to String datatype.
;               This function doesn't depend on installed Microsoft Excel.
; Related .......: _ArrayToString, _ArrayToClip
; Link ..........;
; Example .......; Yes
; ===============================================================================================================================
Func _ArrayToXLS(Const ByRef $avArray, $FileName, $Transpose = False, $iStartRow = 0, $iEndRow = 0, $iStartCol = 0, $iEndCol = 0)
    Local $nBytes

    If Not IsArray($avArray) Then SetError(1, 0, 0)
    $iDimension = UBound($avArray, 0)
    If $iDimension > 2 Then SetError(2, 0, 0)

    $iUBound1 = UBound($avArray, 1) - 1
    If $iEndRow < 1 Or $iEndRow > $iUBound1 Then $iEndRow = $iUBound1
    If $iStartRow < 0 Then $iStartRow = 0
    If $iStartRow > $iEndRow Then Return SetError(3, 0, 0)

    If $iDimension = 2 Then
        $iUBound2 = UBound($avArray, 2) - 1
        If $iEndCol < 1 Or $iEndCol > $iUBound2 Then $iEndCol = $iUBound2
        If $iStartCol < 0 Then $iStartCol = 0
        If $iStartCol > $iEndCol Then Return SetError(4, 0, 0)
    EndIf

    $hFile = _WinAPI_CreateFile($FileName, 1)
    If @error Then Return SetError(5, 0, 0)

    $str_bof = DllStructCreate('short;short;short;short;short;short')
    DllStructSetData($str_bof, 1, 0x809)
    DllStructSetData($str_bof, 2, 0x8)
    DllStructSetData($str_bof, 3, 0x0)
    DllStructSetData($str_bof, 4, 0x10)
    DllStructSetData($str_bof, 5, 0x0)
    DllStructSetData($str_bof, 6, 0x0)
    _WinAPI_WriteFile($hFile, DLLStructGetPtr($str_bof), DllStructGetSize($str_bof), $nBytes)

    Switch $iDimension
        Case 1 ; 1D array
            For $i = $iStartRow To $iEndRow ; 0 To $iUBound1
                If $Transpose Then
                    __XLSWriteCell($hFile, 0, $i - $iStartRow, $avArray[$i])
                Else
                    __XLSWriteCell($hFile, $i - $iStartRow, 0, $avArray[$i])
                EndIf
            Next

        Case 2 ; 2D array
            For $i = $iStartRow To $iEndRow ; 0 To $iUBound1
                For $j = $iStartCol To $iEndCol ; 0 To $iUBound2
                    If $Transpose Then
                        __XLSWriteCell($hFile, $j - $iStartCol, $i - $iStartRow, $avArray[$i][$j])
                    Else
                        __XLSWriteCell($hFile, $i - $iStartRow, $j - $iStartCol, $avArray[$i][$j])
                    EndIf
                Next
            Next
    EndSwitch

    $str_eof = DllStructCreate('short;short')
    DllStructSetData($str_eof, 1, 0x0A)
    DllStructSetData($str_eof, 2, 0x0)
    _WinAPI_WriteFile($hFile, DLLStructGetPtr($str_eof), DllStructGetSize($str_eof), $nBytes)

    _WinAPI_CloseHandle($hFile)
    Return 1
EndFunc ; ==> _ArrayToXLS

; internal helper function for _ArrayToXLS()
Func __XLSWriteCell($hFile, $Row, $Col, $Value)
    Local $nBytes

    $Value = String($Value)
    $Len = StringLen($Value)

    $str_cell = DllStructCreate('short;short;short;short;short;short')
    DllStructSetData($str_cell, 1, 0x204)
    DllStructSetData($str_cell, 2, 8 + $Len)
    DllStructSetData($str_cell, 3, $Row)
    DllStructSetData($str_cell, 4, $Col)
    DllStructSetData($str_cell, 5, 0x0)
    DllStructSetData($str_cell, 6, $Len)
    _WinAPI_WriteFile($hFile, DLLStructGetPtr($str_cell), DllStructGetSize($str_cell), $nBytes)

    $tBuffer = DLLStructCreate("byte[" & $Len & "]")
    DLLStructSetData($tBuffer, 1, $Value)
    _WinAPI_WriteFile($hFile, DLLStructGetPtr($tBuffer), $Len, $nBytes)
EndFunc  ; ==> __XLSWriteCell
Saludos.
diego999
Mensajes: 15
Registrado: 07 Sep 2014, 11:23

Re: Copiar texto que inicie con " y termine con " unicamente

Mensaje por diego999 »

PDF escribió:Bueno, aqui te dejo un ejemplo sencillo utilizando _ArrayToXLS:

Código: Seleccionar todo

#include <Array.au3>
#include <File.au3>
#include <WinAPI.au3>
#include <String.au3>

Local $cadena='1 cualquier cosa "texto texto";	2 asdsdsd "texto texto texto";	3 1212jhjjh "texto";'


Local $aArray = _StringBetween($cadena,'"','"',1,1) ;Extraemos las cadenas que se encuentran entre comillas

 _ArrayDisplay($aArray) ;Esto es solo para ver el contenido de $aArray

_ArrayToXLS($aArray, @ScriptDir & '\test1.xls')


ShellExecute(@ScriptDir & '\test1.xls')


; #FUNCTION# ====================================================================================================================
; Name...........: _ArrayToXLS
; Description ...: Places the elements of an 1D or 2D array into an Excel file (XLS).
; Syntax.........: _ArrayToXLS(Const ByRef $avArray, $sFileName[, $Transpose = False[, $iStartRow = 0[, $iEndRow = 0[, $iStartCol = 0[, $iEndCol = 0]]]]])
; Parameters ....: $avArray - Array to save
;               $sFileName  - Full path to XLS file
;               $Transpose  - [optional] At 2D array changes rows and columns
;               $iStartRow  - [optional] Zero based index (row) of array to start saving at
;               $iEndRow    - [optional] Zero based index (row) of array to stop saving at, if zero then last row is taken
;               $iStartCol  - [optional] Zero based index (column) of array to start saving at
;               $iEndCol    - [optional] Zero based index (column) of array to stop saving at, if zero then last column is taken
; Return values .: Success - 1
;               Failure - 0, sets @error:
;               |1 - $avArray is not an array
;               |2 - $avArray is not 1D/2D array
;               |3 - $iStartRow is greater than $iEndRow
;               |4 - $iStartCol is greater than $iEndCol
;               |5 - couldn't create XLS file
; Author ........: Zedna
; Modified.......:
; Remarks .......: Function supports 1D and 2D arrays. All array's data are converted to String datatype.
;               This function doesn't depend on installed Microsoft Excel.
; Related .......: _ArrayToString, _ArrayToClip
; Link ..........;
; Example .......; Yes
; ===============================================================================================================================
Func _ArrayToXLS(Const ByRef $avArray, $FileName, $Transpose = False, $iStartRow = 0, $iEndRow = 0, $iStartCol = 0, $iEndCol = 0)
    Local $nBytes

    If Not IsArray($avArray) Then SetError(1, 0, 0)
    $iDimension = UBound($avArray, 0)
    If $iDimension > 2 Then SetError(2, 0, 0)

    $iUBound1 = UBound($avArray, 1) - 1
    If $iEndRow < 1 Or $iEndRow > $iUBound1 Then $iEndRow = $iUBound1
    If $iStartRow < 0 Then $iStartRow = 0
    If $iStartRow > $iEndRow Then Return SetError(3, 0, 0)

    If $iDimension = 2 Then
        $iUBound2 = UBound($avArray, 2) - 1
        If $iEndCol < 1 Or $iEndCol > $iUBound2 Then $iEndCol = $iUBound2
        If $iStartCol < 0 Then $iStartCol = 0
        If $iStartCol > $iEndCol Then Return SetError(4, 0, 0)
    EndIf

    $hFile = _WinAPI_CreateFile($FileName, 1)
    If @error Then Return SetError(5, 0, 0)

    $str_bof = DllStructCreate('short;short;short;short;short;short')
    DllStructSetData($str_bof, 1, 0x809)
    DllStructSetData($str_bof, 2, 0x8)
    DllStructSetData($str_bof, 3, 0x0)
    DllStructSetData($str_bof, 4, 0x10)
    DllStructSetData($str_bof, 5, 0x0)
    DllStructSetData($str_bof, 6, 0x0)
    _WinAPI_WriteFile($hFile, DLLStructGetPtr($str_bof), DllStructGetSize($str_bof), $nBytes)

    Switch $iDimension
        Case 1 ; 1D array
            For $i = $iStartRow To $iEndRow ; 0 To $iUBound1
                If $Transpose Then
                    __XLSWriteCell($hFile, 0, $i - $iStartRow, $avArray[$i])
                Else
                    __XLSWriteCell($hFile, $i - $iStartRow, 0, $avArray[$i])
                EndIf
            Next

        Case 2 ; 2D array
            For $i = $iStartRow To $iEndRow ; 0 To $iUBound1
                For $j = $iStartCol To $iEndCol ; 0 To $iUBound2
                    If $Transpose Then
                        __XLSWriteCell($hFile, $j - $iStartCol, $i - $iStartRow, $avArray[$i][$j])
                    Else
                        __XLSWriteCell($hFile, $i - $iStartRow, $j - $iStartCol, $avArray[$i][$j])
                    EndIf
                Next
            Next
    EndSwitch

    $str_eof = DllStructCreate('short;short')
    DllStructSetData($str_eof, 1, 0x0A)
    DllStructSetData($str_eof, 2, 0x0)
    _WinAPI_WriteFile($hFile, DLLStructGetPtr($str_eof), DllStructGetSize($str_eof), $nBytes)

    _WinAPI_CloseHandle($hFile)
    Return 1
EndFunc ; ==> _ArrayToXLS

; internal helper function for _ArrayToXLS()
Func __XLSWriteCell($hFile, $Row, $Col, $Value)
    Local $nBytes

    $Value = String($Value)
    $Len = StringLen($Value)

    $str_cell = DllStructCreate('short;short;short;short;short;short')
    DllStructSetData($str_cell, 1, 0x204)
    DllStructSetData($str_cell, 2, 8 + $Len)
    DllStructSetData($str_cell, 3, $Row)
    DllStructSetData($str_cell, 4, $Col)
    DllStructSetData($str_cell, 5, 0x0)
    DllStructSetData($str_cell, 6, $Len)
    _WinAPI_WriteFile($hFile, DLLStructGetPtr($str_cell), DllStructGetSize($str_cell), $nBytes)

    $tBuffer = DLLStructCreate("byte[" & $Len & "]")
    DLLStructSetData($tBuffer, 1, $Value)
    _WinAPI_WriteFile($hFile, DLLStructGetPtr($tBuffer), $Len, $nBytes)
EndFunc  ; ==> __XLSWriteCell
Saludos.
Si,_StringBetween es lo que encontre para hacerlo,pero me olvide algo importante,necesito que tambien se copien las comillas,que quede asi en una hoja exel:

1 "texto "
2 "texto texto texto etc"
3 "texto textoo etc"
4 y asi sucesivamente

es decir, que queden las comillas en cada celda del exel,aunque tambien estoy averiguando si puedo colocar en exel de forma masiva el entrecomillado a cada texto de cada celda

Por otro lado,se me complica un poco en el ejemplo que pusiste con la variable:

Local $cadena='1 cualquier cosa "texto texto"; 2 asdsdsd "texto texto texto"; 3 1212jhjjh "texto";'

Si uso eso,deberia copiar el texto de todos los documentos desde donde quiero copiar solo el texto entre comillas,no hay manera de que lea el archivo,por ejemplo documento1.srt,y despues ahi aplicarle el _StringBetween ?

Saludos y gracias
Última edición por diego999 el 04 Nov 2014, 02:34, editado 2 veces en total.
PDF
Hacker del Foro
Mensajes: 152
Registrado: 18 Ene 2013, 23:23

Re: Copiar texto que inicie con " y termine con " unicamente

Mensaje por PDF »

Pues lo haces con FileRead

Código: Seleccionar todo

$cadena=FileRead("documento1.srt")
Saludos
diego999
Mensajes: 15
Registrado: 07 Sep 2014, 11:23

Re: Copiar texto que inicie con " y termine con " unicamente

Mensaje por diego999 »

Todo listo,queda asi,probado y funcionando:

Código: Seleccionar todo

#include <Array.au3>
#include <File.au3>
#include <WinAPI.au3>
#include <String.au3>
#include <Excel.au3>

local $cadena=FileRead("D:\Documentos\Documento1.txt")


Local $aArray = _StringBetween($cadena,'"','"',1,1) ;Extraemos las cadenas que se encuentran entre comillas

;_ArrayDisplay($aArray) ;Esto es solo para ver el contenido de $aArray
 
Local $oAppl = _Excel_Open()
Local $oWorkbook = _Excel_BookNew($oAppl)
_Excel_RangeWrite( $oWorkbook, $oWorkbook.Activesheet, $aArray , "A1" )
diego999
Mensajes: 15
Registrado: 07 Sep 2014, 11:23

Re: Copiar texto que inicie con " y termine con " unicamente

Mensaje por diego999 »

No entiendo que sucede,antes trabajaba bien,ahora ensciendo la pc voy a correr el ejecutable para que haga el proceso y llega hasta abrir excel,pero no copia los textos,no modifique nada,que podria ser?
PDF
Hacker del Foro
Mensajes: 152
Registrado: 18 Ene 2013, 23:23

Re: Copiar texto que inicie con " y termine con " unicamente

Mensaje por PDF »

Pues verifica que el directorio "D:\Documentos\Documento1.txt" no haya cambiado, mejor dicho la letra de la unidad si se trata de una memoria usb, en todo caso puedes utilizar macros, o direcciones relativas.

Saludos.
Ermania
Mensajes: 2
Registrado: 15 Dic 2014, 04:52

Re: Copiar texto que inicie con " y termine con " unicamente

Mensaje por Ermania »

Me parece que esto se ve muy bien carcasa galaxy note 4.
Responder