una txt texto separado por net lineas linea leer las especifica datos contenido contar como comas asp archivo agregar c# readline streamreader gedcom

c# - txt - ¿Leyendo una línea de un streamreader sin consumir?



leer el contenido de un archivo en c# (4)

¿Por qué la dificultad? Devuelve la siguiente línea, independientemente. Compruebe si es un nodo nuevo, si no, agréguelo a la estructura. Si es así, crea una nueva estructura.

// Not exactly C# but close enough Collection structs = new Collection(); Struct struct; while ((line = readline()) != null)) { if (IsNode(line)) { if (struct != null) structs.add(struct); struct = new Struct(); continue; } // Whatever processing you need to do struct.addLine(line); } structs.add(struct); // Add the last one to the collection // Use your structures here foreach s in structs { }

¿Hay una manera de leer una línea por delante para comprobar si la siguiente línea contiene datos de etiqueta específicos?

Estoy tratando con un formato que tiene una etiqueta de inicio pero no una etiqueta de final.

Me gustaría leer una línea, agregarla a una estructura y luego probar la línea a continuación para asegurarme de que no sea un nuevo "nodo" y, si no es así, siga agregando si está cerca de esa estructura y cree una nueva.

La única solución que se me ocurre es tener dos lectores de flujo que vayan al mismo tiempo un poco a lo largo del paso de bloqueo, pero eso parece inútil (si es que funcionará)

Necesito algo como echar un vistazo pero peekline


El problema es que el flujo subyacente ni siquiera puede ser buscado. Si echa un vistazo a la implementación del lector de secuencias, utiliza un búfer para que pueda implementar TextReader.Peek () incluso si la secuencia no se puede buscar.

Podría escribir un adaptador simple que lea la siguiente línea y la coloque en el interior, algo como esto:

public class PeekableStreamReaderAdapter { private StreamReader Underlying; private Queue<string> BufferedLines; public PeekableStreamReaderAdapter(StreamReader underlying) { Underlying = underlying; BufferedLines = new Queue<string>(); } public string PeekLine() { string line = Underlying.ReadLine(); if (line == null) return null; BufferedLines.Enqueue(line); return line; } public string ReadLine() { if (BufferedLines.Count > 0) return BufferedLines.Dequeue(); return Underlying.ReadLine(); } }


Esto es lo que voy hasta ahora. Fui más de la ruta dividida que la ruta de la línea de transmisión por línea.

Estoy seguro de que hay algunos lugares que están muriendo para ser más elegantes, pero por ahora parece estar funcionando.

Por favor déjame saber lo que piensa

struct INDI { public string ID; public string Name; public string Sex; public string BirthDay; public bool Dead; } struct FAM { public string FamID; public string type; public string IndiID; } List<INDI> Individuals = new List<INDI>(); List<FAM> Family = new List<FAM>(); private void button1_Click(object sender, EventArgs e) { string path = @"C:/mostrecent.ged"; ParseGedcom(path); } private void ParseGedcom(string path) { //Open path to GED file StreamReader SR = new StreamReader(path); //Read entire block and then plit on 0 @ for individuals and familys (no other info is needed for this instance) string[] Holder = SR.ReadToEnd().Replace("0 @", "/u0646").Split(''/u0646''); //For each new cell in the holder array look for Individuals and familys foreach (string Node in Holder) { //Sub Split the string on the returns to get a true block of info string[] SubNode = Node.Replace("/r/n", "/r").Split(''/r''); //If a individual is found if (SubNode[0].Contains("INDI")) { //Create new Structure INDI I = new INDI(); //Add the ID number and remove extra formating I.ID = SubNode[0].Replace("@", "").Replace(" INDI", "").Trim(); //Find the name remove extra formating for last name I.Name = SubNode[FindIndexinArray(SubNode, "NAME")].Replace("1 NAME", "").Replace("/", "").Trim(); //Find Sex and remove extra formating I.Sex = SubNode[FindIndexinArray(SubNode, "SEX")].Replace("1 SEX ", "").Trim(); //Deterine if there is a brithday -1 means no if (FindIndexinArray(SubNode, "1 BIRT ") != -1) { // add birthday to Struct I.BirthDay = SubNode[FindIndexinArray(SubNode, "1 BIRT ") + 1].Replace("2 DATE ", "").Trim(); } // deterimin if there is a death tag will return -1 if not found if (FindIndexinArray(SubNode, "1 DEAT ") != -1) { //convert Y or N to true or false ( defaults to False so no need to change unless Y is found. if (SubNode[FindIndexinArray(SubNode, "1 DEAT ")].Replace("1 DEAT ", "").Trim() == "Y") { //set death I.Dead = true; } } //add the Struct to the list for later use Individuals.Add(I); } // Start Family section else if (SubNode[0].Contains("FAM")) { //grab Fam id from node early on to keep from doing it over and over string FamID = SubNode[0].Replace("@ FAM", ""); // Multiple children can exist for each family so this section had to be a bit more dynaimic // Look at each line of node foreach (string Line in SubNode) { // If node is HUSB if (Line.Contains("1 HUSB ")) { FAM F = new FAM(); F.FamID = FamID; F.type = "PAR"; F.IndiID = Line.Replace("1 HUSB ", "").Replace("@","").Trim(); Family.Add(F); } //If node for Wife else if (Line.Contains("1 WIFE ")) { FAM F = new FAM(); F.FamID = FamID; F.type = "PAR"; F.IndiID = Line.Replace("1 WIFE ", "").Replace("@", "").Trim(); Family.Add(F); } //if node for multi children else if (Line.Contains("1 CHIL ")) { FAM F = new FAM(); F.FamID = FamID; F.type = "CHIL"; F.IndiID = Line.Replace("1 CHIL ", "").Replace("@", ""); Family.Add(F); } } } } } private int FindIndexinArray(string[] Arr, string search) { int Val = -1; for (int i = 0; i < Arr.Length; i++) { if (Arr[i].Contains(search)) { Val = i; } } return Val; }


Puede guardar la posición accediendo a StreamReader.BaseStream.Position, luego leer la línea siguiente, hacer su prueba, y luego buscar la posición antes de leer la línea:

// Peek at the next line long peekPos = reader.BaseStream.Position; string line = reader.ReadLine(); if (line.StartsWith("<tag start>")) { // This is a new tag, so we reset the position reader.BaseStream.Seek(pos); } else { // This is part of the same node. }

Esto es mucho buscar y releer las mismas líneas. Usando un poco de lógica, es posible que pueda evitar esto por completo; por ejemplo, cuando vea que comienza una nueva etiqueta, cierre la estructura existente y comience una nueva: aquí hay un algoritmo básico:

SomeStructure myStructure = null; while (!reader.EndOfStream) { string currentLine = reader.ReadLine(); if (currentLine.StartsWith("<tag start>")) { // Close out existing structure. if (myStructure != null) { // Close out the existing structure. } // Create a new structure and add this line. myStructure = new Structure(); // Append to myStructure. } else { // Add to the existing structure. if (myStructure != null) { // Append to existing myStructure } else { // This means the first line was not part of a structure. // Either handle this case, or throw an exception. } } }