Página 1 de 1

Copiar texto que inicie con " y termine con " unicamente

Publicado: 02 Nov 2014, 22:54
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...

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

Publicado: 03 Nov 2014, 18:30
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

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

Publicado: 03 Nov 2014, 18:55
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.

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

Publicado: 04 Nov 2014, 02:17
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

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

Publicado: 04 Nov 2014, 02:22
por PDF
Pues lo haces con FileRead

Código: Seleccionar todo

$cadena=FileRead("documento1.srt")
Saludos

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

Publicado: 04 Nov 2014, 04:07
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" )

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

Publicado: 09 Nov 2014, 01:58
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?

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

Publicado: 09 Nov 2014, 02:15
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.

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

Publicado: 15 Dic 2014, 05:04
por Ermania
Me parece que esto se ve muy bien carcasa galaxy note 4.