2009-11-18 6 views
0

У меня есть поля ввода поля текстового поля 123,145,125 I, чтобы разделить это поле на массив целых чисел. И подтвердите это поле true или false, если все проанализировано правильно.Вывести строку CSV в массив целых чисел

КОД:

private bool chkID(out int[] val) 
{ 
    char[] delimiters = new char[] { ',' }; 
    string[] strSplit = iconeID.Text.Split(delimiters); 


    int[] intArr = null; 
    foreach (string s in strSplit) //splits the new parsed characters 
    { 
     int tmp; 
     tmp = 0; 
     if (Int32.TryParse(s, out tmp)) 
     { 
      if (intArr == null) 
      { 
       intArr = new int[1]; 
      } 
      else 
      { 
       Array.Resize(ref intArr, intArr.Length + 1); 
      } 
      intArr[intArr.Length - 1] = tmp; 
     } 

     if (Int32.TryParse(iconeID.Text, out tmp)) 
     { 
      iconeID.BorderColor = Color.Empty; 
      iconeID.BorderWidth = Unit.Empty; 

      tmp = int.Parse(iconeID.Text); 
      val = new int[1]; 
      val[0] = tmp; 
      return true; 
     } 


    } 
    val = null; 
    ID.BorderColor = Color.Red; 
    ID.BorderWidth = 2; 
    return false; 
} 

// новый код: частный BOOL chkID (из INT [] Вэл) // BOOL Satus для функции checkID { строка [] Раскол = srtID.Text.Split (new char [1] {','}); Список номеров = новый Список(); int parsed;

 bool isOk = true; 
     foreach(string n in split){ 
      if(Int32.TryParse(n , out parsed)) 
       numbers.Add(parsed); 
      else 
       isOk = false; 
     } 
     if (isOk){ 
      strID.BorderColor=Color.Empty; 
      strID.BorderWidth=Unit.Empty; 
      return true; 
     } else{ 
      strID.BorderColor=Color.Red; 
      strID.BorderWidth=2; 
      return false; 
     } 
      return numbers.ToArray(); 
     } 
+1

Хорошая идея была бы сказать, что проблема, которую вы имеете с текущим кодом нас. – rerun

+0

И какой это язык. Я предполагаю, что C#, но это потому, что я знаю, что это не Java. – shoover

+0

У меня возникла проблема: мне нужно загрузить XML-данные для заданных идентификаторов в текстовое поле. Для примера: «123456789» Анализировать эту строку CSV в массив целых чисел, проверки полей и загрузки XML-данных для действительного удостоверения личности в благодаря Чад –

ответ

8

Данная функция, кажется, делает слишком много. Вот один, который отвечает на вопрос, подразумеваемый вашего название:

//int[] x = SplitStringIntoInts("1,2,3, 4, 5"); 

static int[] SplitStringIntoInts(string list) 
{ 
    string[] split = list.Split(new char[1] { ',' }); 
    List<int> numbers = new List<int>(); 
    int parsed; 

    foreach (string n in split) 
    { 
     if (int.TryParse(n, out parsed)) 
      numbers.Add(parsed); 
    } 

    return numbers.ToArray(); 
} 

EDIT (на основе ваших комментариев по этому вопросу)

Вы определили три вещей, эта функция должна делать. Теперь вам просто нужно создавать методы для каждого. Ниже приведены мои догадки о том, как вы могли их реализовать.

int[] ValidateIDs(int[] allIDs) 
{ 
    List<int> validIDs = new List<int>(allIDs); 

    //remove invalid IDs 

    return validIDs.ToArray(); 
} 

void DownloadXmlData(int[] ids) 
{ 
    ... 
} 

Теперь вы просто выполнить свои новые функции:

void CheckIconeID(string ids) 
{ 
    int[] allIDs = SplitStringIntoInts(ids); 
    int[] validIDs = ValidateIDs(allIDs); 

    DownloadXmlData(validIDs); 
} 
1

Это может быть стоит ваше время, чтобы проверить это FileHelper а также CSV Reader

Надежда они помогут вам ... Take уход, Том

+0

Но вопрос с вопросом, как разобрать CSV строка из поля формы, а не файл CSV *. – LukeH

+0

Хорошо, сделайте текстовый поток из ввода строки, в соответствии с утилитой FileHelpers, существует метод ReadString, который является частью класса CommonEngine ... см. Прототип ниже ... public static object [] ReadString ( Тип recordClass, строка ввода ); – t0mm13b

+0

На самом деле, не обращайте внимания на первые несколько слов, соответственно. Я снова повторю, мой плохой! в соответствии с утилитой FileHelpers, существует метод ReadString, который является частью класса CommonEngine ... см. прототип ниже ... public static object [] ReadString (Тип recordClass, строковый ввод); – t0mm13b

1

Существует бесплатная бесплатная библиотека для разбора CSV-файлов: FileHelpers

using FileHelpers; 

    // First declare the record class 

    [Delimitedrecord(";")] 
    public class SampleType 
    { 
     public string Field1; 
     public int Field2; 
    } 


    public void ReadExample() 
    { 
     FileHelperEngine engine = new FileHelperEngine(typeof(SampleType)); 

     SampleType[] records;  

     records = (SampleType[]) engine.ReadFile("source.txt"); 

     // Now "records" array contains all the records in the 
     // sourcefile and can be acceded like this: 

     int sum = records[0].Field2 + records[1].Field2; 
    } 
+0

Но вопрос в том, как разбирать строку CSV из поля формы, а не файла CSV *. – LukeH

+0

Нам нужно угадать большую картинку ... может быть, он читает файл, может быть, не ... – 2009-11-19 19:53:56

-1

Это просто, и я думаю, что работает очень хорошо. Она возвращает только действительные номера:

static int[] SplitStringIntoInts(string list) 
{    
    int dummy;    
    return (from x in list.Split(',') 
      where int.TryParse(x.ToString(), out dummy) 
      select int.Parse(x.ToString())).ToArray();   
} 
+0

Прошу прощения, это не сработает. «from x in list» означает, что каждая итерация будет включать один символ в строке «list». Поэтому, если я запустил тестовый пример «10,20», я получу int [] {1,0,2,0} - не желаемый результат. –

+0

@Kirk: Это легко исправить, изменив его на 'from x в list.Split (',')'. – LukeH

+0

@David: Но зачем вызывать 'ToList', а затем' ToArray'? Просто «ToArray» сам по себе выполнит эту работу. – LukeH

0
public bool ParseAndCheck(string source, 
    out IList<int> goodItems, out IList<string> badItems) 
{ 
    goodItems = new List<int>(); 
    badItems = new List<string>(); 

    foreach (string item in source.Split(',')) 
    { 
     int temp; 
     if (int.TryParse(item, out temp)) 
      goodItems.Add(temp); 
     else 
      badItems.Add(item); 
    } 

    return (badItems.Count < 1); 
} 
3

Я действительно хотел бы прокомментировать ответ @Austin Салонен, но это не подходит. Это отличный ответ для заданного вопроса, но я хотел расширить обсуждение в более общем плане на части преобразования csv/int.

  • Это маленькая точка, не стоит много споров, но я хотел бы рассмотреть обменивая петлю foreach для простого for цикла. Вы, скорее всего, получите более простой ИЛ (читайте быстрее). См. (http://www.codeproject.com/KB/cs/foreach.aspx, http://msdn.microsoft.com/en-us/library/ms973839.aspx [Использовать для циклов для String Iteration-version 1]).
  • Я бы создал два метода - один из которых безопасен и использует TryParse и добавляет только «хорошие» значения, а другой - не так безопасен, но быстрее.

Предлагаемая «безопасная» функция (с защитой от перегрузки в случае, если вы не хотите знать, плохие значения) ...

public static int[] SplitAsIntSafe (this string csvString) { 
     List<string> badVals; 
     return SplitAsIntSafe(csvString, ',', out badVals); 
    } 
    public static int[] SplitAsIntSafe (this string delimitedString, char splitChar, out List<string> badVals) { 
     int   parsed; 
     string[] split = delimitedString.Split(new char[1] { ',' }); 
     List<int> numbers = new List<int>(); 
     badVals    = new List<string>(); 

     for (var i = 0; i < split.Length; i++) { 
      if (int.TryParse(split[i], out parsed)) { 
       numbers.Add(parsed); 
      } else { 
       badVals.Add(split[i]); 
      } 
     } 
     return numbers.ToArray(); 
    } 

Предлагаемая «быстрая» функция ....

public static int[] SplitAsIntFast (this string delimitedString, char splitChar) { 
     string[] strArray = delimitedString.Split(splitChar); 
     int[]  intArray = new int[strArray.Length]; 

     if(delimitedString == null) { 
      return new int[0]; 
     } 
     for (var i = 0; i < strArray.Length; i++) { 
      intArray[i] = int.Parse(strArray[i]); 
     } 
     return intArray; 
    } 

В любом случае, надеюсь, что это кому-то поможет.

+0

Неисправность не должна быть тихой, поэтому мне не нравится ваша «безопасная» версия. Моделируя его после самого «TryParse», с результатами, выписанными параметру, и возвращающим значением, указывающим, произошла ли синтаксическая ошибка, мой выбор был бы намного лучше. (Параметр результата может быть либо 'out string []', но я бы предложил, чтобы вызывающий объект предоставил «Список », к которому добавлены элементы синтаксического анализа. В качестве альтернативы верните 'int? []', Который сохраняет информацию о столбцах *, которые не удалось проанализировать. –

+0

@Ben, я думаю, вы делаете слишком широкое заявление. Это зависит от того, что вы хотите. Если вы УЖЕ ЗНАЕТЕ, что у вас смешанные значения и просто хотите, чтобы ints, опубликованная мной версия, Если вы пытаетесь проверить ввод и ХОТИТЕ ЗНАТЬ, если приходит плохой ввод, я согласен с вами. В более позднем случае я не думаю, что я бы сделал возвращаемое значение bool. Это дает мне некоторую информацию, но, возможно, недостаточно. Я бы вернул int [] хороших записей и использовал необязательный выходной параметр 'string [] Bad', чтобы вы могли показывать своим пользователям плохие значения, а не оставлять его/ее, чтобы искать строку. – EBarr

0

В .NET 2.0 вы можете написать

string test = "123,14.5,125,151,1.55,477,777,888"; 

bool isParsingOk = true; 


int[] results = Array.ConvertAll<string,int>(test.Split(','), 
    new Converter<string,int>(
     delegate(string num) 
     { 
      int r; 
      isParsingOk &= int.TryParse(num, out r); 
      return r; 
     })); 
Смежные вопросы