Извлечение данных из большой строки - PullRequest
3 голосов
/ 15 марта 2012

Прежде всего, я использую функцию ниже для чтения данных из pdf-файла.

public string ReadPdfFile(string fileName)
    {
        StringBuilder text = new StringBuilder();

        if (File.Exists(fileName))
        {
            PdfReader pdfReader = new PdfReader(fileName);

            for (int page = 1; page <= pdfReader.NumberOfPages; page++)
            {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);

                currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText)));
                text.Append(currentText);
                pdfReader.Close();
            }
        }
        return text.ToString();
    }

Как видите, все данные сохраняются в виде строки.Строка выглядит следующим образом:

label1: data1;
label2: data2;
label3: data3;
.............
labeln: datan;

Мой вопрос: Как я могу получить данные из строки на основе меток?Я пробовал это, но я застреваю:

   if ( string.Contains("label1")) 
   {
       extracted_data1 = string.Substring(string.IndexOf(':') , string.IndexOf(';') - string.IndexOf(':') - 1);
   }
   if ( string.Contains("label2"))
   {
       extracted_data2 = string.Substring(string.IndexOf("label2") + string.IndexOf(':') , string.IndexOf(';') - string.IndexOf(':') - 1); 
   } 

Ответы [ 5 ]

3 голосов
/ 15 марта 2012

Посмотрите на функцию String.Split() , она маркирует строку на основе предоставленного массива символов.

например,

 string[] lines = text.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries);

, теперь проходите циклэтот массив и разделить каждый снова

foreach(string line in lines) {
      string[] pair = line.Split(new[] {':'});
      string key = pair[0].Trim();
      string val = pair[1].Trim();
      ....
   }

Очевидно, проверьте наличие пустых строк и используйте .Trim(), где это необходимо ...

[EDIT] Или, в качестве альтернативы, в качестве хорошего Linqзаявление ...

var result = from line in text.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries)
             let  tokens = line.Split(new[] {':'})
             select tokens;

Dictionary<string, string> = 
       result.ToDictionary (key => key[0].Trim(), value => value[1].Trim());
1 голос
/ 15 марта 2012

Вы можете сделать это, используя Dictionary<string,string>,

            Dictionary<string, string> dicLabelData = new Dictionary<string, string>();
            List<string> listStrSplit = new List<string>();
            listStrSplit = strBig.Split(';').ToList<string>();//strBig is big string which you want to parse

            foreach (string strSplit in listStrSplit)
            {
                if (strSplit.Split(':').ToList<string>().Count > 1)
                {
                    List<string> listLable = new List<string>();
                    listLable = strSplit.Split(':').ToList<string>();

                    dicLabelData.Add(listLable[0],listLable[1]);//Key=Label,Value=Data
                }
            }

dicLabelData содержит данные всех меток ....

1 голос
/ 15 марта 2012

Это довольно жестко запрограммировано, но вы можете использовать что-то вроде этого (с небольшой подгонкой под ваши нужды):

    string input = "label1: data1;" // Example of your input
    string data = input.Split(':')[1].Replace(";","").Trim();
0 голосов
/ 15 марта 2012

Вы можете использовать регулярное выражение, чтобы сделать это:

Regex rx = new Regex("label([0-9]+): ([^;]*);");
var matches = rx.Matches("label1: a string; label2: another string; label100: a third string;");

foreach (Match match in matches) {
    var id = match.Groups[1].ToString();
    var data = match.Groups[2].ToString();
    var idAsNumber = int.Parse(id);

    // Here you use an array or a dictionary to save id/data
}
0 голосов
/ 15 марта 2012

Я думаю, вы можете использовать регулярное выражение для решения этой проблемы.Просто разбейте строку на строку разрыва и используйте регулярное выражение, чтобы получить правильное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...