(Si usted está buscando la manera de convertir tabulaciones en espacios en un editor, ver al final de mi respuesta)
Casi 8 años de edad, pero recientemente tuve que reemplazar las pestañas por espacios.
La solución reemplaza la pestaña con hasta 4 u 8 espacios.
La lógica itera a través de la cadena de entrada, un carácter a la vez y realiza un seguimiento de la posición actual (columna #) en la cadena de salida.
- Si se encuentra con
\t
(pestaña char) - Comprueba la pestaña siguiente parada, calcula cuántos espacios que necesita para llegar a la siguiente tabulación, reemplaza \ t con los número de espacios.
- If
\n
(nueva línea): lo asocia a la cadena de salida y restablece el puntero de posición en 1 en la nueva línea. Las nuevas líneas en Windows son \r\n
y en UNIX (o sabores) usan \n
, así que supongo que esto debería funcionar para ambas plataformas. He probado en Windows, pero no tengo UNIX a mano.
- Cualquier otro carácter: lo asocia a la cadena de salida e incrementa la posición.
.
using System.Text;
namespace CSharpScratchPad
{
class TabToSpaceConvertor
{
static int GetNearestTabStop(int currentPosition, int tabLength)
{
// if already at the tab stop, jump to the next tab stop.
if ((currentPosition % tabLength) == 1)
currentPosition += tabLength;
else
{
// if in the middle of two tab stops, move forward to the nearest.
for (int i = 0; i < tabLength; i++, currentPosition++)
if ((currentPosition % tabLength) == 1)
break;
}
return currentPosition;
}
public static string Process(string input, int tabLength)
{
if (string.IsNullOrEmpty(input))
return input;
StringBuilder output = new StringBuilder();
int positionInOutput = 1;
foreach (var c in input)
{
switch (c)
{
case '\t':
int spacesToAdd = GetNearestTabStop(positionInOutput, tabLength) - positionInOutput;
output.Append(new string(' ', spacesToAdd));
positionInOutput += spacesToAdd;
break;
case '\n':
output.Append(c);
positionInOutput = 1;
break;
default:
output.Append(c);
positionInOutput++;
break;
}
}
return output.ToString();
}
}
}
El código de llamada sería como
string input = "I\tlove\tYosemite\tNational\tPark\t\t,\t\t\tGrand Canyon,\n\t\tand\tZion";
string output = CSharpScratchPad.TabToSpaceConvertor.Process(input, 4);
cadena de salida sería obtener el valor
I love Yosemite National Park , Grand Canyon,
and Zion
¿Cómo se convierte tabulaciones en espacios en un editor?
Si se topa con esta pregunta porque no puede encontrar la opción de convertir pestañas en espacios en los editores (al igual que hice y pensé en escribir su propia utilidad para hacerlo), aquí es donde se encuentra la opción en diferentes editores -
Notepad++: Edit > Blank Operations > TAB to Space
Visual Studio: Edit > Advanced > Untabify Selected Lines
SQL Management Studio: Edit > Advanced > Untabify Selected Lines
Algunas respuestas aquí no son conscientes del concepto de tabulaciones (ver http : //www.gnu.org/software/emacs/manual/html_node/emacs/Tab-Stops.html y http://www.jwz.org/doc/tabs-vs-spaces.html). @ckal, Nick-McCowin y user275640 son respuestas correctas. – Jonke
@Jonke publicó una nueva solución para determinar correctamente la tabulación con hasta 4 u 8 espacios. – HappyTown