Удаление пустых полей из файла с разделителями с помощью VB.NET

Используя VB.NET (VS2013), я хотел бы прочитать файл с разделителями и удалить поле, если все записи имеют одно и то же пустое поле (может быть несколько полей для каждой записи). Файл с разделителями может иметь «x» количество столбцов и «y» количество строк, и после удаления пустых полей мне нужно записать его обратно как новый файл с разделителями.

Входной файл будет иметь заголовок, который необходимо поддерживать, и порядок записей должен поддерживаться. Я знаком с использованием TextParser для чтения файла и знаком с записью файла — мне нужна помощь, чтобы прочитать пустое поле и удалить его, если оно существует во всем файле.

Я думал, что мне придется использовать сетку данных, но никогда не использовал их, поэтому искал какое-то понимание, которое укажет мне направление.

Спасибо!


person George Vaisey    schedule 30.06.2015    source источник
comment
Это определенное поле или любое поле? Когда вы записываете это обратно, столбец/поле остается или исчезает? Что за демимитированный файл? CSV, TabDelimited?   -  person Ňɏssa Pøngjǣrdenlarp    schedule 30.06.2015
comment
Это может быть любое поле (единственное известное поле, которое будет содержать информацию, — это запись заголовка). При обратной записи следует удалить заголовок, если в столбце нет других данных.   -  person George Vaisey    schedule 30.06.2015
comment
Много-много неизвестных, но причина таких инструментов анализа, как TextFieldParse, заключается в том, что очень опасно использовать String.Split для анализа файлов, поэтому осторожно двигайтесь в этом направлении. Вы можете использовать OleDB для импорта файла; затем, возможно, используйте фильтры, чтобы определить, от каких строк избавиться; избавиться от нежелательных столбцов тоже было бы легко.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 30.06.2015


Ответы (2)


Я предполагаю, что каждая строка разделена символом новой строки... откройте текстовый файл, прочитайте строку за раз и используйте метод Split, чтобы разбить строку на массив строк. Метод split принимает аргумент, определяющий используемый разделитель. Откройте файл назначения и запишите массив строк, используя цикл.

person nicomp    schedule 30.06.2015
comment
Я знаю, как читать файл и анализировать или разбивать его на массив. Вопрос заключается в том, чтобы определить, пусто ли поле во всех записях; не выписывай. - person George Vaisey; 30.06.2015
comment
Вы можете прочитать весь набор записей в ArrayList или аналогичную структуру данных, а затем написать цикл, просматривая все записи для поиска пустых полей. Это механическое, но это работает. - person nicomp; 30.06.2015

ОБНОВИТЬ

Если подумать, у вас могут быть записи с парой пустых столбцов, а в остальных есть данные. Я не уверен, что вы захотите удалить эти столбцы, потому что в этом случае вы потеряете структуру строки.

Таким образом, вместо использования StringSplitOptions.RemoveEmptyEntries вы можете просто выполнить Split(), а затем выполнить некоторые Linq, чтобы узнать, создал ли Split() массив пустых строк.

Что-то вроде (с теми же результатами)...

Imports System
Imports System.Linq

Public Module Module1

    Public Sub Main()
        Dim data As String = "|||||"
        Dim pieces As String() = data.Split("|"c)
        If pieces.Where(Function(p) String.IsNullOrEmpty(p) = False).Count = 0 Then
            Console.WriteLine("All elements are empty")
        Else
            ' Do something
        End If
    End Sub
End Module

Демо

СТАРЫЙ ОТВЕТ

У String.Split() есть перегрузка, исключающая StringSplitOptions. Используйте StringSplitOptions.RemoveEmptyEntries с вашим String.Split(), и если все записи пусты, вы получите массив длиной 0, который вы можете игнорировать.

Imports System

Public Module Module1
    Public Sub Main()
        Dim data As String = "|||||"
        Dim pieces As String() = data.Split(new Char() {"|"}, StringSplitOptions.RemoveEmptyEntries)
        If pieces.length = 0 Then
            Console.WriteLine("All elements are empty")
        Else
            ' Do something
        End If
    End Sub
End Module

Результаты:

All elements are empty

Демо

person Shar1er80    schedule 30.06.2015