Mostrando las entradas con la etiqueta C#. Mostrar todas las entradas
Mostrando las entradas con la etiqueta C#. Mostrar todas las entradas

martes, marzo 17, 2009

Implementando algoritmo de la distancia de Levenshtein en C#

La referencia del algoritmo la pueden encontrar en la siguiente ruta
http://en.wikipedia.org/wiki/Levenshtein_distance, es muy ejemplificante y
los links te llevan a algunas modificaciones que existen sobre el mismo algoritmo.


Un poco de teoria:

La distancia de levenshtein permite calcular diferenciala entre 2 cadenas de caracteres, es decir el minimo numero de
operaciones necesarias para que una palabra s se transforme en una palabra t.
La operaciones que necesarias para que esto ocurra son las siguientes:

Td
aba --------->aa eliminacion

Ti
aa ---------->aba inserccion

Ts
aba ---------> ada sustitucion


¿Que es esto? bueno si tienes la palabra:

1. PERRO ---> PERROS : La distancia es 1 por que la diferencia entre perro y perros es 1 que es (s) la operacion es insercción
2. MOTO ----> FOTO : La distancia es 1 por que la diferencia entre MOTO y FOTO es F la operacion es sustitución


   1:          public int LevenshteinDistance(string s, string t)
   2:          {
   3:              // d is a table with m+1 rows and n+1 columns
   4:              int costo = 0;
   5:              int m = s.Length;
   6:              int n = t.Length;
   7:              int[,] d = new int[m + 1, n + 1];
   8:   
   9:              // Verifica que exista algo que comparar
  10:              if (n == 0) return m;
  11:              if (m == 0) return n;
  12:   
  13:              // Llena la primera columna y la primera fila.
  14:              for (int i = 0; i <= m; d[i, 0] = i++) ;
  15:              for (int j = 0; j <= n; d[0, j] = j++) ;
  16:   
  17:   
  18:              /// recorre la matriz llenando cada unos de los pesos.
  19:              /// i columnas, j renglones
  20:              for (int i = 1; i <= m; i++)
  21:              {
  22:                  // recorre para j
  23:                  for (int j = 1; j <= n; j++)
  24:                  {
  25:                      /// si son iguales en posiciones equidistantes el peso es 0
  26:                      /// de lo contrario el peso suma a uno.
  27:                      /// 
  28:                      costo = (s[i - 1] == t[j - 1]) ? 0 : 1;
  29:                      d[i, j] = System.Math.Min(System.Math.Min(d[i - 1, j] + 1,  //Eliminacion
  30:                          d[i, j - 1] + 1),                                       //Inserccion
  31:                          d[i - 1, j - 1] + costo);                               //Sustitucion
  32:   
  33:                  }
  34:              }
  35:          /// Calculamos el porcentaje de cambios en la palabra.
  36:              if (s.Length > t.Length)
  37:                  porcentaje = ((double)d[m, n] / (double)s.Length);
  38:              else
  39:                  porcentaje = ((double)d[m, n] / (double)t.Length);
  40:              return d[m, n];
  41:          }
  42:   
  43:          double _porcentaje = 0;
  44:   
  45:      

martes, septiembre 25, 2007

Import & Export con SQLDMO.

Hola, bueno hace bastante tiempo que no escribo pero bueno, aquí estoy de vuelta.


Hace unos dias estaba haciendo unas pruebas de como subir y bajar datos desde MSQL 2005 con C#, utilizando SQLDMO, y bueno después de un rato lo conseguí.

aquí la reseña.

Primero antes que nada hay que agregar la referencia a SQLDMO ( Interop.SQLDMO.dll).


using SQLDMO;


Bueno vamos a comenzar con bajar la información de una tabla "TBLXX" desde una base "BD_YY", el proceso es simple y a resumidas cuentas es el siguiente: Se genera una conexion a la BD, se configura el objeto BulkCopy, se instancia el objeto de la tabla con un Item de la BD y se exporta a un path elegido.


   1:  public void PaJuera()
   2:  {
   3:  SQLServer server = new SQLServerClass();

   4:  _BulkCopy bcp = new BulkCopyClass();
   5:  _Database db = new DatabaseClass();
   6:  _Table table = new TableClass();
   7:  server.EnableBcp = true; // Abusados si no ponen esto no pifa.
   8:  server.Connect(ServInstance, "usr", "****");
   9:  bcp.DataFileType = AQLDMO_DATAFILE_TYPE.SQLDMODataFile_CommaDelimitedChar;
  10:  bcp.RowDelimiter = @"\n";
  11:  bcp.UseExistingConnection = true;
  12:  bcp.MaximumErrorsBeforeAbort = 1000;
  13:  bcp.UseBulkCopyOption = true;
  14:  bcp.IncludeIdentityValues = true;
  15:  bcp.UseServerSideBCP = false;
  16:  bcp.DataFilePath = "archivo.txt";
  17:  table = server.Databases.Item("BD_YY", "dbo").Tables.Item("TBLXX", "dbo");
  18:  table.ExportData(bcp);
  19:  server.DisConnect();
  20:   
  21:  }


DataFilePath: es el nombre del archivo al que se va exportar la informacion.
No se olviden de cerrar la conexion y vaciar los objetos que ya no van a ocupar.


la parte de pa' dentro es muy parecida, lo unico que cambia es que en DataFilePath se pone el archivo origen y la parte de:

table.ImportData(bcp)

y eso es todo.

Saludos y espero les sirva.