es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El datatable de Powershell creó un problema de fila nula.

Estoy escribiendo un script de Powershell para crear contactos únicos en una tabla de datos. Los pasos son los siguientes:

En primer lugar, extraje los datos de un archivo CSV y los coloqué en la tabla de datos $dt_uniqueContacts (con una sola columna). Luego, agregué más registros de otra fuente utilizando Rows.Add.

$dt_uniqueContacts.Rows.Add($arow) | Out-Null

Esto aumentó el tamaño original de $dt_uniqueContacts. Tengo “Out-Null” en cada operación Rows.Add para evitar crear una fila nula, como sugiere otro hilo.

Después de esto, apliqué el comando -unique para hacer que $dt_uniqueContacts sea único y lo sobrescribí.

$dt_uniqueContacts = $dt_uniqueContacts.Select(“”, “Contacts ASC”) | Select-Object Contacts -Unique

El problema es que después de la operación única, $dt_uniqueContacts crea una fila adicional al principio. No se puede mostrar y no afecta a rows.count, sin embargo, al hacer lo siguiente, arrojará un error en el primer bucle (contra esa fila nula). No sé cómo eliminar esa fila ni cómo detectarla con una declaración “If”, null o “” no funciona.

foreach ($r in $dt_uniqueContacts) {
$aContact = $r.Contacts
if ($aContact.Contains(“”)) {…
Arroja este error:

La invocación del método falló porque [System.DBNull] no contiene un método llamado ‘Contains’.

El problema solo ocurre cuando se incluye alguna función (es decir, .Contains en este caso). Si omito la línea .Contains, la fila $null en el bucle foreach de $dt_uniqueContacts no generará un error y se ejecutará como si no hubiera una fila $null.

¿Alguna sugerencia?

Gracias a todos de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que la fila adicional que se crea después de aplicar la operación -unique es una fila nula. Para eliminar esta fila, puedes utilizar la propiedad Rows del datatable y usar el cmdlet Where-Object para filtrar cualquier fila que tenga valores nulos en la columna Contacts:

    $dt_uniqueContacts = $dt_uniqueContacts.Rows | Where-Object { $_.Contacts -ne [System.DBNull] } | Select-Object Contacts -Unique

    Esto primero obtendrá todas las filas en el datatable utilizando la propiedad Rows, luego filtrará cualquier fila donde la columna Contacts sea nula utilizando el cmdlet Where-Object, y finalmente aplicará la operación -unique para obtener solo los contactos únicos.

    Ahora, cuando iteras a través de $dt_uniqueContacts utilizando el bucle foreach, la fila nula no debería generar un error.

    foreach ($r in $dt_uniqueContacts) {
    if ($r.Contacts -ne [System.DBNull] -and $r.Contacts.Contains("'")) {...

    Ten en cuenta que en lugar de usar la variable $aContact, puedes verificar directamente los valores nulos en la columna Contacts en la declaración if. Además, asegúrate de verificar los valores nulos antes de llamar a cualquier método de cadena en él para evitar errores.

Comments are closed.